<?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[Abdulhakeem Mustapha]]></title><description><![CDATA[Creative and result-oriented Software Engineer with over 6 years of experience building amazing web and mobile applications, coordinating cross-functional teams]]></description><link>https://blog.amustapha.com</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 18:21:34 GMT</lastBuildDate><atom:link href="https://blog.amustapha.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[You don't need AWS, i know someone who can do it better and cheaper]]></title><description><![CDATA[Introduction
As a startup founder, or an indie engineer or tech enthusiats, we’ve been conditioned for our first thoughts on cloud deployment to be “AWS”. One would think it’s probably popular because it’s the best on the market or the cheapest, or t...]]></description><link>https://blog.amustapha.com/you-dont-need-aws-i-know-someone-who-can-do-it-better-and-cheaper</link><guid isPermaLink="true">https://blog.amustapha.com/you-dont-need-aws-i-know-someone-who-can-do-it-better-and-cheaper</guid><category><![CDATA[AWS]]></category><category><![CDATA[server]]></category><category><![CDATA[Devops]]></category><category><![CDATA[deployment automation]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Thu, 29 Jan 2026 17:29:38 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction</h2>
<p>As a startup founder, or an indie engineer or tech enthusiats, we’ve been conditioned for our first thoughts on cloud deployment to be “AWS”. One would think it’s probably popular because it’s the best on the market or the cheapest, or the easiest to setup</p>
<p>All those are far from true. Imagine a provider requiring you to take certifications just to use their services? that just shows you how unintuitive it is. Well.. I’ve had my fair share of frustrations with AWS but that’s not the point for todays discussion. Today, I want to tell you about someone who can do it cheaper.</p>
<h2 id="heading-the-problem">The problem</h2>
<p>First, let’s paint a few scenarios…</p>
<ol>
<li><p>You’re thinking of building an app and you’ve not decided on a cloud provider, then you get to see someone is offering $1K in AWS credits, sounds very interesting deal, you don’t need to spend a dime to get your project running for the first year. But then, by the second year, you’re spending 10x what you should ideally spend to keep your project alive, you got trapped by one year free credit to spend much more than you’ll need to run your infrasture in a decade. Now you’re tightly knit into the architecture, you can’t simply move because you have built your system to work seemlessly with the over engineered AWS ecosystem, earning your self a certified AWS architect badge</p>
</li>
<li><p>You’re building out your simple API then decided lambdas are the best thing to happen since the internet and you decided to host your function there, need to setup serverless do a bunch of configs and as a first timer… you finally got it running, at almost zero cost, then you realized you need to persist your data to db which requires you to configure VPCs, then you need to make extenral api calls to third party services and that forces you to learn about NAT gatewars, then your app isn’t fast enough which tries to make you optimize, then… you introduce warm ups. You find yourself innovating around “artificial problems” that sometimes feel they exist just for profiteering. At first, it was magical, no servers to manage but then once you build something significantly of value that behaves like a real world app, calling multiple apis, making DB queries, sending back feedback to user and collecitng logs, you realize how precisely you must configure your setup just to get things to work, and how fragile it can get when you accidentally change a value.</p>
</li>
<li><p>You’ve built your app which is now running but because of how non deterinistic external api calls are, and how well you need information to effectively debug you learn you’re being billed per how much data you log, how often you read them and how long they last. Then one day you decided to stress test your app and voila… you raked up $2k in AWS bills across logs, lambda, etc. It was meant to be free you say to yourself, but now it’s already too late. You find yourself deciding if you need to remove specific logs just to save cost, then you have to troubleshoot a specific user experience issue and you’re entirely blind.</p>
</li>
</ol>
<p>I’ve been through all of these phases, especially when you realize alot of roles expect you to have mastery of AWS skills.</p>
<h2 id="heading-the-realization">The realization</h2>
<p>I was building Pipersoft which was an inventory management solution that allowed SMEs to easily manage their books and inventory, however we were spending almost $100 monthly to keep our GCP instance running (birds of same feather), we almost went out of business because we were engineers at core and focussed on building awesome solutions but not on how to get it sold (story for another day). Well, to keep the long story short, an independent VPS cost 3x less than it did on GCP and for a product we just chose to kept alive as legacy, it made sense to be able to spend around $10 monthly on server monthly coming from $60-ish.</p>
<p>Then, an old colleague bought me into a project at one of their startups (he’s a seial entrepreneur), and I was getting into trouble with AWS, we weren’t live yet but our bills were getting to around $50 a month just accross lamdas, cognito, s3 and dynamodb (and some other hidden layers we didn’t know we needed to pay for), as someone who came from lean startup backgrounds I felt that was outlandish, if dev environment needed $50 to work, how much do we budget for prod initial stages, also considering that after building a product, it typically took them months to setup the business side, get a business manager, etc. I flaunted the idea of owning our own infra and we spun up a $6 dollar instance which worked fine (but crashed often 😂 due to limited resources and contention), but the point is… for a fixed $6 bill we could get a small online instance to test with. We scaled that instance 2x and it ran alot smoother for testing.</p>
<p>We shipped, they were happy and then i got pinged that they had another project setup by an ex-”company name here” engineer who setup a $400/month cluster for them in testing phase. Not to get too much into the details (I wasn’t even interested in understanding their AWS setup coz I had full permission to nuke and give them something cheaper to test with, plus there was no data to backup). Long story short, 2 serers of $18 each (about 4GB ram) were deployed which served them in testing phase well.</p>
<p>Then i needed to understand, what’s the catch… why is AWS priced premium but gives worse performance (higher latency, slower response, cold starts, etc.). Well, i figured out the catch, there was infact none.</p>
<p>I could go on rambling about how a much more talented mentor optimized a ~$2K AWS bill to a single 64GB ram server costing $120, or how a client was prohibitive and re emphasizing for me to be careful with their AWS account as their previous devs “accidentally” almost bankrupted them. He was shocked to find out we deployed their entire infra on a server which costs less than $60 and responds in under 1s (p95).</p>
<h3 id="heading-the-solution">The solution</h3>
<p>You probably have gotten the drift by now, but if you haven’t, self managed VPS are alot cheaper than managed services, often provide better hardware (becuase you get to pick) than AWS, have lower latency, better performance and overall gives you a better control over your resources. But the management nightmare scares folks away, then in comes <a target="_blank" href="https://dokploy.com/">Dokploy</a> which gives me a neat UI to deploy and mange my projects and even manage multiple servers. It handles auto deploys, logs, domains, etc. almost anything you’d need to effectively deploy your application, and it’s <strong>FREE</strong></p>
<p>Here’s what my current setup looks like, a server from Vultr setup with dokploy, applications setup with docker &amp; docker compose to orchestrate, and pushing code to github auto redeploys my application, i get to see deployment status.</p>
<h3 id="heading-recommendations">Recommendations</h3>
<ol>
<li><p>Dedicated servers are better when you’re going into prod and need guaranteed performance.</p>
</li>
<li><p>VPS providers are not equal, two providers might provide identical instances but benchmarking them would give your very different results.</p>
</li>
<li><p>There are publicly available benchmarks, explore them compare providers before deciding</p>
</li>
<li><p>Avoid hostinger, it’s a trap. So far as per my experience, i’ve tried linode, digital ocean, hostinger and Vultr. Vultr has the best performance and Hostinger has the worst.</p>
</li>
<li><p>AVOID any provider that wants you to prepay for morethan a month, it’s usually aa trap for terrible performance</p>
</li>
</ol>
<p>TLDR: AWS is expensive for most usecases, get your self a VPS for predictable billing and easier infra setup.</p>
]]></content:encoded></item><item><title><![CDATA[Improving Testing Efficiency with Requestly]]></title><description><![CDATA[As a developer, I have found Requestly to be a valuable tool in improving the testing and mocking of my frontend apps. It allows me to easily simulate different scenarios and conditions, ensuring that my apps are reliable and perform well under a var...]]></description><link>https://blog.amustapha.com/improving-testing-efficiency-with-requestly</link><guid isPermaLink="true">https://blog.amustapha.com/improving-testing-efficiency-with-requestly</guid><category><![CDATA[requestly]]></category><category><![CDATA[Testing]]></category><category><![CDATA[Frontend Development]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Tue, 27 Dec 2022 22:09:20 GMT</pubDate><content:encoded><![CDATA[<p>As a developer, I have found Requestly to be a valuable tool in improving the testing and mocking of my frontend apps. It allows me to easily simulate different scenarios and conditions, ensuring that my apps are reliable and perform well under a variety of circumstances.</p>
<p>One way I use Requestly is to mock the behavior of certain API calls and responses. This allows me to test how my app handles different types of data and scenarios, without relying on live APIs that may be unstable or have rate limits. By mocking the responses of these API calls, I can ensure that my tests are consistent and reliable.</p>
<p>In addition to mocking API calls, I also use Requestly to modify the appearance of my app for specific users or locations. For example, if I want to test how my app looks and performs in a specific country, I can use Requestly to change the user's IP address and simulate a connection from that location. This allows me to see how my app behaves under different conditions and make any necessary adjustments.</p>
<p>Overall, Requestly has been a valuable tool in my testing and development process. It allows me to easily mock and modify the behavior of my frontend apps, ensuring that they are reliable and perform well in a variety of conditions.</p>
]]></content:encoded></item><item><title><![CDATA[Acing Technical Interviews]]></title><description><![CDATA[I got thinking about how competitive interviews can get. I once applied for a role at tailwindui and the creator tweeted a few weeks later that they got 900+ entries for just 1 role, I still tried being optimistic, but didn't even get an invite to an...]]></description><link>https://blog.amustapha.com/acing-technical-interviews</link><guid isPermaLink="true">https://blog.amustapha.com/acing-technical-interviews</guid><category><![CDATA[interview]]></category><category><![CDATA[Technical writing ]]></category><category><![CDATA[job search]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Thu, 22 Apr 2021 19:55:06 GMT</pubDate><content:encoded><![CDATA[<p>I got thinking about how competitive interviews can get. I once applied for a role at tailwindui and the creator tweeted a few weeks later that they got 900+ entries for just 1 role, I still tried being optimistic, but didn't even get an invite to an interview. Fast forward, 1 year later, I had my first interviews at Google, but I also didn't get in.</p>
<p>But then, here I am trying to give you some tips on how to Ace your technical interviews, quite ironic. Well, I'm just trying to free my mind and hopefully help someone while doing so. On the bright side, here's something I can confidently say, in the last 1 year, for each interview I had done there was a 90% chance of me getting a next interview and a 65% chance of getting an offer. I've of course had to turn down offers. Here's how I do it.</p>
<h2 id="confidence">Confidence</h2>
<p>The feedback I've gotten from most recruiters who cared to give me one is about my confidence. I'm confident I know what I'm doing, and very confident I'm up to the task so I'm able to talk confidently. The one time my confidence left me was during my interview at Google, but that's a tale for another day. There's a saying that: People won't trust you if you don't seem to trust yourself.
So, the first thing is when you go to an interview, walk in with confidence.</p>
<h2 id="relevance">Relevance</h2>
<p>Next, you need to know who you're talking to and stick to conversations that would be relevant to them. There are technical recruiters who understand architecture and some complex programming constructs, but most of the time, they aren't so deep in the understanding of those technical concepts. Your understanding of who your recruiter is, without necessarily asking upfront and tilting your conversation towards what they'll understand better would be a good booster. If you go too technical with someone who has no idea what you're talking about is as good as you not having that conversation in the first place.
How can you establish relevance? Start out your conversation by introducing yourself and touching across some technical things you achieved, problems you've solved and a bit of story to surround it. Watch their body language and where you get the most nods is most likely their strength, double down on that.</p>
<h2 id="ask-questions">Ask questions</h2>
<p>This is a hard one, but you should get accustomed to asking your interviewer at least one question, try keeping it open enough that it can take you down to some subsequent followup questions. Also, even though there are no stupid questions, there are questions that can make you look stupid. What I mean by this, you don't want to ask questions like, "So what does your company do?", or "What's your tech stack?" those are things you could have found with a little reading on the job description or their website. Asking more specific questions that shows you've researched about their company or that you understand their niche is a booster, and asking even more interesting questions can push you further.</p>
<h2 id="solution">Solution</h2>
<p>One of my "star boy" moments in an interview is when we got chatting (back and forth questions + followup) with my interviewer and he mentioned some bottlenecks in their system, and being a concept I've worked on like 2 years prior, I asked a question (posed as a probable solution) on an approach they could take to reduce the extent of the problem, it was a moment of a little excitement from both of us, we discussed more on it and even though your interviewer doesn't have clearance to give you promises, he gave the next steps and a timeline for me to expect a next call schedule.</p>
<p>This is of course not an extensive guide, a single article to rule them all. Rather this is a summarization of my thoughts and the things that are ontop of my mind right now.</p>
]]></content:encoded></item><item><title><![CDATA[Stock Investing isn't that hard]]></title><description><![CDATA[I've had a few people ask about my stock investing strategy. Even though I try to study as much as possible on making the best stock decisions, here are a few caveats:

I have a tiny portfolio
I'm not a finance expert
My purchases are for learning pu...]]></description><link>https://blog.amustapha.com/stock-investing-isnt-that-hard</link><guid isPermaLink="true">https://blog.amustapha.com/stock-investing-isnt-that-hard</guid><category><![CDATA[Business and Finance ]]></category><category><![CDATA[personal]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Fri, 16 Apr 2021 16:12:29 GMT</pubDate><content:encoded><![CDATA[<p>I've had a few people ask about my stock investing strategy. Even though I try to study as much as possible on making the best stock decisions, here are a few caveats:</p>
<ol>
<li>I have a tiny portfolio</li>
<li>I'm not a finance expert</li>
<li>My purchases are for learning purposes</li>
<li>I'm not that smart</li>
</ol>
<p>But if you're still interested in knowing how I choose stocks let's dive in.</p>
<h2 id="1-industry">1. Industry</h2>
<p>My current portfolio is spread across</p>
<ol>
<li>Tech</li>
<li>Energy</li>
<li>Precious Metals</li>
<li>Real Estate</li>
<li>Utilities</li>
</ol>
<p>First, I identify what industry I would like to buy into, there's a few restrictions I impose upon myself mostly around ethics or faith. Right now, industries I'm looking into are Solar Panels and Renewable Energy, Semiconductors, Aviation and commodities. I often find industries that I personally feel are very relevant or would be relevant mostly through research or gut feeling. Once I have an industry, I begin my research and finding a company that meets as many of my checklist criteria</p>
<h2 id="2-financial-health">2. Financial Health</h2>
<p>I'm quite an old school on this. But the reality is being a Nigerian, I'm not open to buying a company that's structured like Nigeria. For financial health, I try to look at a companies debt levels and see if it's reasonable. Debt for most companies is a good thing (esp. in a bullish market), but can be disastrous at the slightest economic tremor (a case study of Hertz). I often find companies that are in a good financial spot and don't have too much debt hanging over their head. I often aim for a debt/equity of under 70% depending on industry and industry averages, certain industries have higher debt exposure than others, but the closer it is to zero the better.</p>
<h2 id="3-revenue-growth">3. Revenue Growth</h2>
<p>It goes without saying, I'm interested in companies that are still growing and have a high potential for growth. I'm more interested in a slow but steady growth around 5-20% annual growth in the last 3-5 years than a company that grows 90% one year and shrinks by 60% the following year. I of course love big numbers but prefer consistency. Consistent revenue growth gives me an (a perceived) indication that </p>
<ol>
<li>The company understands their market and is doing a good job solving a problem</li>
<li>The company is expanding: the bigger the pie, the bigger my bite</li>
<li>The company could become relevant in the industry if it's taking good market share</li>
</ol>
<p>Rapid/Inconsistent growth often seems to me like a miracle or luck. Can be more rewarding but it's harder to time.</p>
<h2 id="4-valuation">4. Valuation</h2>
<p>Just like everyone, I love a bargain. I'd love to buy a good company on a discount, it's like paying 70cents on the dollar, who doesn't like a great deal?
On valuation, I find good companies that are trading below their fair valuation or great companies that are trading just around their fair valuation. There are several methods to calculating valuation but, personally, I use the valuation from simplywall.st. The higher the discount the more interested I am. I'd like to buy a company at a 20-30% discount from it's valuation and hold it for as long as I can.</p>
<h2 id="5-how-good-with-money">5. How good with money</h2>
<p>I learnt that when reading summaries, companies have legal yet deceptive ways of masquerading the true depth of their financial mess, while burying it in the fine print. Similar to how a company can bury crazy terms in their 50-page T&amp;C document, auditors can also hide a mess making it less obvious but they still have to be truthful. I try taking a look at a companies cashflow over time, i.e where their money comes from and where it goes to, in more savvy terms I look at</p>
<ol>
<li>Operating expenses: I'd love to see this relatively constant or better shrink</li>
<li>Earnings: I love to see this getting bigger</li>
<li>Free cashflow: I love to see a positive value getting bigger</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[The Rise of Internet Gurus]]></title><description><![CDATA[If you aspire to perspire the desire you admire, you fire and it backfires... don't retire

This quote should be resounding to any Nigerian who is fairly active on the internet. Our internet space today (from twitter, down to youtube and everything b...]]></description><link>https://blog.amustapha.com/the-rise-of-internet-gurus</link><guid isPermaLink="true">https://blog.amustapha.com/the-rise-of-internet-gurus</guid><category><![CDATA[2Articles1Week]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Wed, 15 Jul 2020 21:32:35 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>If you aspire to perspire the desire you admire, you fire and it backfires... don&#39;t retire</p>
</blockquote>
<p>This quote should be resounding to any Nigerian who is fairly active on the internet. Our internet space today (from twitter, down to youtube and everything between, i.e facebook, Instagram, etc.) is filled with &quot;self-proclaimed billionaires&quot; who want to change your life. I&#39;m familiar with some faces and get really pisses whenever I see them advertise to me on youtube, but I don&#39;t want to stir up a controversy. I&#39;ll tell you a few ways to spot a scamru (scam guru) 😅 and you can make the rest of the decisions yourself. The truth is everybody wants to motivate you these days, or as one of my mentors rightfully puts it, </p>
<blockquote>
<p>Everyone want&#39;s to make money from your headache. The pharmacy, the pharmaceutical company, even your son who pockets the change 😂😂😂.</p>
</blockquote>
<p>This goes without saying, there are some really genuine billionaires who manage to create time to share their experiences, for a good marketing copy, they might exaggerate their stories. But the bulk of the other guys are just selling you a dream, telling you how they make millions of dollars in revenue (via dropshipping, drop servicing, officeless agency, freelance work, etc.) monthly, but they cannot really give you anything concrete beyond that. I&#39;m going to tell you a few ways to spot the fake Niggas trying to swindle you of your hard-earned money.</p>
<p>If you&#39;ve read my article,  <a target='_blank' rel='noopener noreferrer'  href="https://blog.amustapha.com/the-richest-man-in-babylon-ckckgeork007jf6s1ghhn0g3x">The Richest Man in Babylon</a>, I clearly stated a consistent human trait of the desire to amass wealth, gain financial freedom and have some control over your affairs. Well, one solid Business Creation/Marketing principle is, &quot;Identifying want&quot; and creating a service to fulfil it. For example, I want to easily share my personal life with friends and family, Facebook got you. I want to pepper dem 😀, go to Instagram. More malicious examples would be <a target='_blank' rel='noopener noreferrer'  href="https://play.google.com/store/apps/details?id=com.lcit.handsanitizer">A virtual Hand sanitizer app</a> on play store, which states down in the app description that &quot;This app only simulates Hand Sanitizer. It can not actually disinfect your hands!&quot;, well we know ourselves, we don&#39;t read the description. Apparently this app has over 100K downloads on play store and is probably the work of a bored developer, he explicitly states that it&#39;s just for fun purposes, but I can see people in the review section asking for a vitual facemask too. The irony, most self-proclaimed gurus would give you a sort of disclaimer too, but they won&#39;t explicitly tell you they&#39;re setting you up for failure. Now, let&#39;s proceed to debunk some a<strong>*</strong>s.</p>
<p>I&#39;ll give most of my reviews based on my favourite online business personality,  <a target='_blank' rel='noopener noreferrer'  href="https://twitter.com/akinalabi">Akin Alabi</a>. Go through his twitter profile, study it and ponder, then let&#39;s talk about three things. </p>
<p>Sample 1</p>
<blockquote>
<p> I know you&#39;re about to watch a video, but wait let me tell you something that would change your life.</p>
</blockquote>
<p>Sample 2:</p>
<blockquote>
<p>If you&#39;re a Nigerian trying to immigrate to Canada or anywhere else, you&#39;re probably doing it wrong.</p>
</blockquote>
<p>Sample 3:</p>
<blockquote>
<p>I started my poultry business with a single egg 😂😂😂.</p>
</blockquote>
<h2 id="1-really-rich-people-don-t-show-off-">1. Really rich people don&#39;t show off.</h2>
<p>If the videos start by flashing you a Lamborghini, Burj Al Arab Background,  or Cash, it&#39;s probably &quot;Yet Another Guru&quot; (YAG). The funny thing is this, most successful people don&#39;t live an extravagant lifestyle. Someone can run a company raking in millions of Naira monthly, but he simply drives an Accord or Camry. Most rich people remain rich by spending like the poor, they keep their expenses under control, and don&#39;t want to attract too much attention. But people that know them know they are rich. Akin Alabi is said to be worth between $75m - $150m, but you don&#39;t see him in videos flaunting cars or cash, he doesn&#39;t need your validation. There are successful people that enjoy to show off their wealth, and hence this isn&#39;t meant to be a total red flag.</p>
<h2 id="2-successful-people-have-an-actual-business-and-would-always-talk-about-it">2. Successful people have an actual business, and would always talk about it</h2>
<p>This is the most critical part. For most people who create time to help young people start a business and succeed, they themselves must have a business and they&#39;ll talk about it a lot. They&#39;ll talk about your business from a Marketing perspective, (how else do you become successful if not by letting people know what you do) and also to give context. To give context or make you understand a concept, they&#39;ll tell you a way they applied it themselves and most probably which company, at what stage, the problem they had and how it helped them. They always talk about their business because it&#39;s at the top of their head. To cap this off, if he tells you he does dropshipping or anything else but can&#39;t tell you where he does it (business name, address, website, etc.) he most probably is trying to sell you a dream, and you would be his main business. </p>
<h2 id="3-successful-people-often-don-t-have-time-">3. Successful people often don&#39;t have time.</h2>
<p>I&#39;ve a few mentors who I consider successful in their field, and here&#39;s the fact, they often don&#39;t have time. Managing a business is overtime work, I&#39;ve watched a video interview of Aliko Dangote where he says he works over 16hours a day. You might actually not consider what they do to be work, but deep analytical thinking is hard work. Back to my mentors whom I&#39;ve met physically, they&#39;re often busy, they meet with clients, staff, partners, prospects, investors, plan a new business expansion, travel (for work and leisure), and sometimes it&#39;s hard to get a good hour of discussion with them. Of course, I don&#39;t meet with them weekly, it&#39;s less frequent and we often have to squeeze in time with their schedule, (and it&#39;s something I appreciate a lot). Well, yes, successful people can create time, but not too much time that can affect their business. That only happens when they&#39;ve got their business to an &quot;auto-pilot&quot; stage, and that&#39;s hard.</p>
<p>To wrap this up, I&#39;ll give you a bonus youtube video: https://www.youtube.com/watch?v=L9Gpr7PEnbs. James explains the Online Gurus better. </p>
]]></content:encoded></item><item><title><![CDATA[Write less VueJS Code using the <component /> component]]></title><description><![CDATA[I finished the recommendation system, and it had 49 levels of nested if's

So sayeth Adam (a friend) and that was how he to be known as "The Lord of Nested if's". To bring this into perspective, Imagine the following code
if a_condition_is_met: # lev...]]></description><link>https://blog.amustapha.com/write-less-vuejs-code-using-the-lesscomponent-greater-component</link><guid isPermaLink="true">https://blog.amustapha.com/write-less-vuejs-code-using-the-lesscomponent-greater-component</guid><category><![CDATA[2Articles1Week]]></category><category><![CDATA[Vue.js]]></category><category><![CDATA[clean code]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Tue, 14 Jul 2020 17:14:52 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>I finished the recommendation system, and it had 49 levels of nested if&#39;s</p>
</blockquote>
<p>So sayeth Adam (a friend) and that was how he to be known as &quot;The Lord of Nested if&#39;s&quot;. To bring this into perspective, Imagine the following code</p>
<pre><code class="lang-python"><span class="hljs-keyword">if</span> a_condition_is_met: <span class="hljs-comment"># level 1</span>
    <span class="hljs-keyword">if</span> another_condition_is_met: <span class="hljs-comment"># level 2</span>
        <span class="hljs-keyword">if</span> yet_another_condition_is_met: <span class="hljs-comment">#level 3</span>
            <span class="hljs-comment">#... down to level 49</span>
    <span class="hljs-keyword">elif</span> a_second_condition_is_met: <span class="hljs-comment"># level 2 branch 2</span>
        <span class="hljs-comment"># ... so it continues with deep nesting and branching</span>
</code></pre>
<p>Now, that was long ago and he writes much neater code today, but I want to address all the &quot;if disciples&quot; out there.</p>
<p>I was refactoring a codebase which constructs HTML forms based on JSON data which makes the forms to easily be modified and shared with other users. But alas, it had an if entanglement 😅. Let me show you</p>
<pre><code class="lang-html"> <span class="hljs-tag">&lt;<span class="hljs-name">b-select</span> <span class="hljs-attr">if</span>=<span class="hljs-string">"field.type === 'select'"</span>
           <span class="hljs-attr">:required</span>=<span class="hljs-string">"field.required"</span>
           <span class="hljs-attr">v-model</span>=<span class="hljs-string">"shadowValue"</span>
           <span class="hljs-attr">:mode</span>=<span class="hljs-string">"field.mode"</span>
           @<span class="hljs-attr">change</span>=<span class="hljs-string">"$emit('input', shadowValue)"</span>
           <span class="hljs-attr">:readOnly</span>=<span class="hljs-string">"field.read_only"</span>
           <span class="hljs-attr">:options</span>=<span class="hljs-string">"field.options"</span> /&gt;</span>

<span class="hljs-comment">&lt;!--
a bunch of other v-else-if's to render image  upload fields, 
checkboxes, radio, etc.
--&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">b-input</span> <span class="hljs-attr">v-else</span>
          <span class="hljs-attr">:placeholder</span>=<span class="hljs-string">"field.label"</span>
          <span class="hljs-attr">:type</span>=<span class="hljs-string">"field.type"</span>
          <span class="hljs-attr">:multiline</span>=<span class="hljs-string">"field.multiline"</span> # <span class="hljs-attr">regular</span> <span class="hljs-attr">input</span> <span class="hljs-attr">field</span> <span class="hljs-attr">or</span> <span class="hljs-attr">textarea</span>
          <span class="hljs-attr">:required</span>=<span class="hljs-string">"field.required"</span>
          <span class="hljs-attr">:readOnly</span>=<span class="hljs-string">"field.readonly"</span>
          <span class="hljs-attr">:min</span>=<span class="hljs-string">"field.min"</span>
          <span class="hljs-attr">:max</span>=<span class="hljs-string">"field.max"</span>
          <span class="hljs-attr">v-model</span>=<span class="hljs-string">"shadowValue"</span>
          @<span class="hljs-attr">input</span>=<span class="hljs-string">"$emit('input', shadowValue)"</span> /&gt;</span>

<span class="hljs-comment">&lt;!-- 
field JSON representation
{
    "type": "date",
    "label": "Date",
    "size": {
        "span": 8
    }
}
--&gt;</span>
</code></pre>
<p>The form scope originally only included a few input types, until the project grew and we had some 16+ conditional matching and we still had new field types to be added. There are no nested ifs, but there there are a lot of ifs.</p>
<p>And this is where we got to use the vue <code>&lt;component/&gt;</code> tag. We had lesser if&#39;s, shorter code and our code came to look like</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">component</span> <span class="hljs-attr">:is</span>=<span class="hljs-string">"field.tag"</span> <span class="hljs-attr">v-bind</span>=<span class="hljs-string">"field"</span>
            @<span class="hljs-attr">input</span>=<span class="hljs-string">"$emit('input', shadowValue)"</span> /&gt;</span>

<span class="hljs-comment">&lt;!-- 
field JSON representation
{
    "tag": "b-input",
    "type": "date",
    "label": "Date",
    "size": {
        "span": 8
    }
}
--&gt;</span>
</code></pre>
<p>This meant we could use all input field types provided by our component library and even our own custom components without having to explicitly add a new v-if block.</p>
<p>Do you think that&#39;s clean code? Let me know in the comments.</p>
]]></content:encoded></item><item><title><![CDATA[The Richest Man in Babylon]]></title><description><![CDATA[Many of us are filled with the desire to amass wealth and live the dream, travel places, enjoy a lavish lifestyle, and do things at your own pace. If desire alone could get things done, we all would be a Jeff Bezos, but hard work makes it happen. Per...]]></description><link>https://blog.amustapha.com/the-richest-man-in-babylon</link><guid isPermaLink="true">https://blog.amustapha.com/the-richest-man-in-babylon</guid><category><![CDATA[2Articles1Week]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Mon, 13 Jul 2020 11:59:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1594641443912/IZ9TZVbRf.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Many of us are filled with the desire to amass wealth and live the dream, travel places, enjoy a lavish lifestyle, and do things at your own pace. If desire alone could get things done, we all would be a Jeff Bezos, but hard work makes it happen. Personally, I have so much desire to amass wealth through legal means, enjoy life, give my kids a headstart in life, improve the livelihood of people and pay my religious obligations when due.</p>
<p>Well, that&#39;s everyone&#39;s dream, but there&#39;s but one problem. We have a lean purse/bank account.  Reading the book &quot;The Riches Man in Babylon by George S. Classon&quot;, the author claims that within it contains some remedies for a lean purse and fundamental principles (tips) for fattening your bank account. You should be aware by now how I&#39;ll frequently substitute the words (purse, bank account) to mean the same thing. Before I begin, let me drop the first interesting quote.</p>
<blockquote>
<p>Would you call a fisherman lucky, who for years so studied the habits of the fish that with each changing wind he could cast his nets about them? Opportunity is a haughty goddess who wastes no time with those who are unprepared.</p>
</blockquote>
<p>Think about that for a moment, and then let&#39;s proceed. The advice to follow sound so easy yet are hard to observe. We live in a consumer economy where everyone is trying to sell you something you most certainly don&#39;t need, and even occasionally don&#39;t want.</p>
<h1 id="1-a-part-of-all-you-earn-is-yours-to-keep">1. A part of all you earn is yours to keep</h1>
<p>As Ironically as this sounds, most of us live as slaves. Once we get a paycheck, we race to the market to pay merchants for their merchandise, yet we rarely keep any for ourselves. If you live so (a.k.a, live from hand to mouth), you&#39;re only working for the merchants and manufacturers. I witnessed this in my NYSC(<a target='_blank' rel='noopener noreferrer'  href="https://en.wikipedia.org/wiki/National_Youth_Service_Corps">Learn more about NYSC here</a>) years where most people were already broke 2 weeks after payday and were eagerly waiting for the next payday. People would finish NYSC with zero savings and hope for pension after service 😂😂😂. Well, I was somewhat caught up in the rush too, but I was different, mostly spending money trying to run a business that was guzzling everything I had. The author&#39;s perspective is regardless of how much you earn, take out at least 10% of it and put in a savings account, eventually, you won&#39;t even notice you spent 10% less because you&#39;d still be broke. If you feel you&#39;re underemployed and earning ₦10,000 which is barely enough to get by... trust me, ₦12,000 naira would be a big deal to you in a year if you stick to the plan. The rationale is, if you feel ₦10,000 isn&#39;t enough to get by on, there&#39;s someone earning much less, and someone isn&#39;t earning at all and getting by. The goal is to get yourself out of Money troubles in no time. So every morning, remember to say to yourself... &quot;A part of all I earn is mine to keep&quot;. This is the first step to fattening your bank account.</p>
<h1 id="2-live-within-your-means">2. Live within your means</h1>
<p>It&#39;s 2020, and for every ₦1000 you have, there are 1001 things that could take it away. Suya with a chilled bottle of Coke, A pack of food from an exclusive restaurant, Full Chicken, Airtime, Internet subscription, just name it. For every kobo in your pocket, there are a lot of predators willing to guzzle it away and it&#39;s your job to protect your money. To be able to keep a part of what you earn, you must first be able to live within your means. For the majority of people earning Minimum wage, ₦33,000, if a miracle happens and they begin to make ₦100,000 the first line of action would be to change the furniture in the house, redecorate the whole house or move to a new &quot;more expensive&quot; apartment, change your personal wardrobe, or change your kid&#39;s school to a more expensive one. None of these things is bad, they&#39;re all the enjoyment of life and eventually don&#39;t we make money to live a good life? Wait, before you do that quickly why not increase the money you put aside from 10% (₦3,300 on your old pay scale) to 35% (₦35,000 on your new pay scale). You still have double your previous salary to spend. I&#39;m in no position to tell you how you spend your money, but please... &quot;Control your expenditures&quot;.</p>
<h1 id="3-make-your-money-multiply">3. Make your money multiply</h1>
<p>Let&#39;s say you&#39;re earning a minimum wage ₦33,000 and you successfully managed to save up 10% of your salary for 1 whole year. That&#39;s ~₦40,000. A lot Nigerians argue that ₦40,000 isn&#39;t a lot of money, look don&#39;t let anybody deceive you. By some standard 1 million naira isn&#39;t a lot of money. But now, you&#39;ve successfully save ₦40,000 how would you proceed? In life it&#39;s easy to double money in 5 years, quadruple it in 10 years and get 10x returns in 20years. But, what would you double if you have ₦0 to begin with? Now that you&#39;ve saved up ₦40,000 it&#39;s time to plan how to make this money make more money for you. There are several ways to achieve that.</p>
<ol>
<li><p>Invest in yourself by learning skills that can make you earn more. If you&#39;re making ₦33,000 as a labourer you can easily get a diploma in anything and begin to earn ₦50,000 or more. Get another degree/certification which continuously increases your ability to earn. </p>
</li>
<li><p>Invest in other things to make your money grow. Some common examples of this are stocks, private equity, properties, contributions, etc. But protect your wealth. As a Muslim, I avoid Riba hence you don&#39;t see me mentioning things that pay interest. Do your personal research and find ways that conform with your personal beliefs on growing wealth. Also, be careful not to chase the wind, you should be more interested in the return of your capital than huge profits. You see all those binomo guys on Whatsapp and twitter promising to double your money in 45minutes, you might as well kiss your money goodbye. A decent return of between 10-20% per annum is great because inflation is currently above 10%. And a rule of thumb, any investment that can easily give you 50% returns can also easily eat away 50% of your hard-earned money. Don&#39;t invest in the latest trending business because everyone else is doing it, there is foolishness in the crowd, do your personal research and understand where you are putting your money and how you would make a profit. e.g I own Shell stocks, and Boeing stocks, I bought them amidst Covid-19 when they fell by over 50% in value and if everything goes well, I could get back a portfolio doubled or tripled in the next 3-5 years or my money could be lost if they filed for bankruptcy. </p>
</li>
</ol>
<h1 id="4-luck-hope-is-not-a-strategy">4. Luck + Hope is not a strategy</h1>
<p>This addresses one of the most common myths about amassing wealth and living the dream. Dangote just got lucky, his uncle gave him ₦500,000 💁🏽. Well, would you consider  <a target='_blank' rel='noopener noreferrer'  href="https://twitter.com/akinalabi">Akin Alabi</a>  or  <a target='_blank' rel='noopener noreferrer'  href="https://twitter.com/ronaldnzimora">Ronald Nzimora</a> lucky?
Let&#39;s talk about luck.</p>
<p>A quick definition: Luck success or failure apparently brought by chance rather than through one&#39;s own actions. For most of us wishing to amass wealth by luck, &quot;Hope&quot; is the twin, we continuously hope for luck. But, according to the book in view, luck was discussed in three dimensions</p>
<ol>
<li><p>Lucky luck: This is the original form of luck that we all wish for. To bring it more into perspective, the luck of someone accidentally sending 2 bitcoins into your crypto wallet 😋, or finding a bag containing some substantial amount of cash 🥰. We&#39;re not interested in talking about ethics (obviously you should return it, but given that you decide you own it and want to keep it), something more interesting worth a debate is: &quot;How frequently can you get this lucky&quot;. Are there specific ways of guaranteeing to be lucky enough to always find (and pick) some substantial amount of money on a regular basis? Well, I know quite a few people who are well to do, but none of them amassed their wealth of someone else&#39;s misery.</p>
</li>
<li><p>Gaming Luck: Two characters are missing in the middle of the word &quot;Gaming&quot;, they&#39;re &quot;bl&quot;. Of course, as grown adults, we&#39;ve become accustomed to the fact that it&#39;s not possible to get so lucky to pick up some good amount of money weekly while walking down the street, and even so, we&#39;d be scared of turning to yam 😂😂😂. But, we grow to believe we can plan for luck and turn to the gambling table, at least as of the time of this writing according to Alexa, Bet9ja is the second most visited site by Nigerians second only to Google (perhaps because we still use google to find bet9ja 😅). Akin Alabi, the pioneer of sports betting in Nigeria (NairaBET.com) wrote in his book  <a target='_blank' rel='noopener noreferrer'  href="https://www.konga.com/product/small-business-big-money-3321793">Small Business, Big Money</a>:  &quot;People will do well if they do not bet on sports but you know what? They want to bet and as a smart entrepreneur, I have to make the platform available.&quot; He also said elsewhere in the same book that &quot;I thought sports betting was really cool so I started playing it. I won some and lost some. It was fun. Even though I really wanted to win, I didn&#39;t put much money into it because of the risk involved and I saw it more as a form of entertainment. It is not an investment. It is gambling and for me, it is a form of entertainment.&quot;</p>
</li>
<li><p>Opportunity: This is is what people claim they don&#39; have, and goes the saying &quot;talent is equally distributed, but opportunity is not&quot;. This is not completely true. Well, in life, well all get our own fair share of opportunity, but the bigger question is &quot;Are you able to make good use of it?&quot;. I was reading a thread on twitter the other day of a Chinese-American guy who&#39;s fathers admission was swapped with the daughter of a corrupt politician to study Engineering. The daughter had the opportunity but was withdrawn for bad performance. More realistic opportunities are those associated with our daily work, e.g Zoom has been thriving and trying to perfect their video conferencing software, alas Covid-19 came, Work from home became commonplace, their stock price quickly rose on the stock market crossing a 3x growth within 6 months, everyone had equal opportunity to have made a profit from the work remote work and the overall Covid-19 but different people were positioned in different places which didn&#39;t make them make a profit, to other&#39;s it was a thread. To an investor who hesitated to invest in Zoom, that&#39;s an opportunity that just slipped by his fingers.</p>
</li>
</ol>
<p>To wrap this up,</p>
<blockquote>
<p>Men of Action are favoured by the goddess of Goodluck</p>
</blockquote>
<p>The lessons from the book are so deep beyond being covered in a single article. I wouldn&#39;t want to bore you with some unending tales. This just covers half the book. If you find it interesting, then you should get yourself a copy.</p>
]]></content:encoded></item><item><title><![CDATA[Startup Nation]]></title><description><![CDATA[Reading is my new found hobby. I have a stack of print books (probably 50) and another 30 on Audible. After reading my first few books, I felt like I grew by 10 years with experience and within 18 months, my personal library grew from 0 to about 70-9...]]></description><link>https://blog.amustapha.com/startup-nation</link><guid isPermaLink="true">https://blog.amustapha.com/startup-nation</guid><category><![CDATA[Startups]]></category><category><![CDATA[books]]></category><category><![CDATA[2Articles1Week]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Fri, 10 Jul 2020 19:13:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1594409953994/vAVPPPopc.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Reading is my new found hobby. I have a stack of print books (probably 50) and another 30 on Audible. After reading my first few books, I felt like I grew by 10 years with experience and within 18 months, my personal library grew from 0 to about 70-90, cutting across everything from religion, startups, personal development, politics and Marketing. Yeah... it&#39;s shocking, I don&#39;t have tech books. I mostly read documentation, StackOverflow, crash courses and articles. I have a ton of courses on Udemy.</p>
<p>I just listened to  <a target='_blank' rel='noopener noreferrer'  href="https://www.audible.com/pd/Start-Up-Nation-Audiobook/B0036GRHAQ">Startup Nation</a>  on Audible, and I&#39;d be writing a review, i.e My personal notes of important things from the book. I won&#39;t call it a summary, the book itself is rich in information and would recommend you read it for yourself, or you decide on that after reading my personal note.</p>
<p>Let me start with one of my favourite quotes</p>
<blockquote>
<p>Hybrids are like mermaids. When you want a fish you get a woman and when you need a woman you get a fish.</p>
</blockquote>
<p>This was in the context of cars that run both on fossil fuel and on batteries. But that quote cracks me up anytime I read it again. Now, to the order of the day...</p>
<h2 id="lesson-1-failing-isn-t-enough-reason-to-give-up-but-society-matters">Lesson 1: Failing isn&#39;t enough reason to give up, but society matters</h2>
<p>According to the book, the Israeli culture did not condemn failure, rather it was embraced and seen as a learning opportunity. The book further mentions that if you ran a startup and failed, it&#39;s a lot easier to succeed in your next attempt, and it was a lot easier to get funding in Isreal. The culture didn&#39;t support excuses either when you fail you should learn from that failure and strive to not stumble on that same mistake again</p>
<h2 id="lesson-2-no-gossips">Lesson 2: No gossips</h2>
<p>The book emphasized why gossips (sidewalks) aren&#39;t commonplace in Isreal, they had a flat structure which comes from their mostly military background, a Sergent could request a General to fetch him a cup of coffee provided he&#39;s closest to the coffee pot. In a startup environment, this translates to junior developers being able to point out design flaws by the CTO without fear of being ridiculed. It also meant everyone could say their mind without it falling on deaf ears. In summary, they discussed their concerns as they arise, they don&#39;t allow small issues to build into a toxic relationship. This is my personal favourite.</p>
<h2 id="lesson-3-anything-can-be-achieved-you-can-make-it-work">Lesson 3: Anything can be achieved, you can make it work</h2>
<p>The book started with a narration of how Shai Agassi wanted to make electric cars, and the first expert in the automobile industry told them, it couldn&#39;t be done, a more suitable approach was hybrid. That was the basis of the quote earlier. I&#39;ve faced this several times, and right now have every physicist telling me perpetual motion isn&#39;t possible, well... there should be a way to make it work, and that&#39;s going to mean free energy. Another scenario was when the Israeli team at intel wanted the company to dump the current approach of &quot;the more the processor speed, the more electricity you have to put in&quot;. Sometimes, you have to change how you think and approach the problem. A senior politician didn&#39;t also get funding &amp; approval to start nuclear research/plant, funded it off-budget, got students to do the research and had a nuclear plant at the end of the day.</p>
<h2 id="lesson-4-don-t-plan-too-much-be-prepared-for-surprises">Lesson 4: Don&#39;t plan too much, be prepared for surprises</h2>
<p>I study a bit about the military, firearms and missiles and how they work, and a trend I spotted is... the more autonomy an officer has, the better the overall military performs, of course until it gets to a point of diminishing return. The Israeli army was very understaffed, that meant one person wore many hats, and information was democratized. During air strikes, everyone was prepared for the worst and everyone knew what was to be done, anyone and everyone was responsible for neutralizing the enemy. It worked for them, I believe it should work anywhere.</p>
<h2 id="lesson-5-when-life-throws-you-lemons-make-lemonade">Lesson 5: When life throws you lemons, make lemonade</h2>
<p>Other than the fact that the Israeli nation learnt to become independent because of the relationship with its neighbours on all fronts, they also used that opportunity to make the country into a lab for testing ideas. The craziest being, fish farming in the middle of the desert. After digging about 500 meters to find water, the salty water. Rather than just abandoning the search on heading straight for desalination, they used the water to raise fishes which couldn&#39;t ordinarily be domesticated.</p>
<p>The book holds some interesting treasures, and I wouldn&#39;t want to bore you with too much information. If you found this interesting you might consider reading the full book.</p>
]]></content:encoded></item><item><title><![CDATA[My three favourite youtube channels.]]></title><description><![CDATA[I spend a lot of time on youtube, and yesterday alone I watched over 2hours of videos on youtube. My watchlist is typically anything Engineering, History, Personal Finance, Investment, Marketing, Startups, Management, Programming, comedy and many mor...]]></description><link>https://blog.amustapha.com/my-three-favourite-youtube-channels</link><guid isPermaLink="true">https://blog.amustapha.com/my-three-favourite-youtube-channels</guid><category><![CDATA[youtube]]></category><category><![CDATA[learning]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Wed, 03 Jun 2020 09:57:29 GMT</pubDate><content:encoded><![CDATA[<p>I spend a lot of time on youtube, and yesterday alone I watched over 2hours of videos on youtube. My watchlist is typically anything Engineering, History, Personal Finance, Investment, Marketing, Startups, Management, Programming, comedy and many more. Something I enjoy is, learning every day... this cannot be overemphasized. Yes, I watch movies too on youtube.</p>
<p>Well, today I&#39;ll tell you three of my favourite youtube channels. I follow about 60 youtube channels, and there&#39;s a whole lot more I watch their videos but don&#39;t follow, but let&#39;s get down to business.</p>
<p>Limiting my favourites to mention just three is somewhat restrictive, and it&#39;ll be hard to do justice, even to myself. But a hack around, I&#39;ll just pick one channel in three different categories I love watching.</p>
<h1 id="-1-how-it-s-made-https-www-youtube-com-channel-ucelt4nocnwdenyjmov4zqya-"><a target='_blank' rel='noopener noreferrer'  href="https://www.youtube.com/channel/UCELt4nocnWDEnYJmov4zqyA">1. How it&#39;s made</a></h1>
<p>This channel remains at the top of this list even though they&#39;ve really not updated new content in the past 3 years, but if you find the anatomy of mechanical equipment interesting and you&#39;re always curious about how things work/how they&#39;re made, then this channel is just it for you. As a bonus <a target='_blank' rel='noopener noreferrer'  href="https://www.youtube.com/channel/UCqZQJ4600a9wIfMPbYc60OQ">Learn Engineering</a> is a much more updated channel that analyzes how things work, not just how they&#39;re made.</p>
<h1 id="-2-graham-stephan-https-www-youtube-com-channel-ucv6kdgjskwaeckne5apa0aq-"><a target='_blank' rel='noopener noreferrer'  href="https://www.youtube.com/channel/UCV6KDgJskWaEckne5aPA0aQ">2. Graham Stephan </a></h1>
<p>Someone told me today that</p>
<blockquote>
<p>Mastery of sexual urge and financial discipline are two essential factors to forming a man.</p>
</blockquote>
<p>Well, financial discipline is a somewhat hard to realize, especially with all the frenzy of showing off on social media. But, learning that material things aren&#39;t the things that give happiness and you don&#39;t get rich by trying to prove it.</p>
<p>If you&#39;re just starting out your career and want to have a long term financial plan, you should consume as much content on financial discipline as you can lay your hands on. But this goes without saying, no single person has all the answers, from anyone always take what you feel is relevant to you.</p>
<h1 id="-3-ronu-creative-https-www-youtube-com-channel-ucwvffnkevg-el-mdabizpuq-"><a target='_blank' rel='noopener noreferrer'  href="https://www.youtube.com/channel/UCWvfFnkEvg-eL-mDabIZpUQ">3. Ronu Creative</a></h1>
<p>I&#39;m a curious person very interested in history, Nigerian history. Ronu Creative is a relatively young channel that discusses a lot of Nigerian history with less bias. As a bonus, <a target='_blank' rel='noopener noreferrer'  href="https://www.youtube.com/channel/UCsooa4yRKGN_zEE8iknghZA">TED-Ed</a> has a playlist with a much wider collection of human history among several other topics.</p>
<p>If you found this article useful, share with friends and share your thoughts in the comments section. If you know any other channel worthy of mention, please let&#39;s know in the comment section.</p>
<p>Rounding up, one very important video I&#39;d like to share with you as a bonus for reading this to the end is: <a target='_blank' rel='noopener noreferrer'  href="https://www.youtube.com/watch?v=L9Gpr7PEnbs">The Rise of Fake Gurus: The Dark Truth Behind Making MILLIONS from Online Courses</a>. </p>
]]></content:encoded></item><item><title><![CDATA[Personal Finance Discipline for Developers]]></title><description><![CDATA[Twitter is a crazy neighbourhood and being there every day seeing what a lot of Nigerian youths tweet (probably a reflection of how the think), is heartbreaking. I can't help but wonder... Are those really the leaders of tomorrow.
But, amidst all the...]]></description><link>https://blog.amustapha.com/personal-finance-discipline-for-developers</link><guid isPermaLink="true">https://blog.amustapha.com/personal-finance-discipline-for-developers</guid><category><![CDATA[money]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Wed, 27 May 2020 19:27:52 GMT</pubDate><content:encoded><![CDATA[<p>Twitter is a crazy neighbourhood and being there every day seeing what a lot of Nigerian youths tweet (probably a reflection of how the think), is heartbreaking. I can&#39;t help but wonder... Are those really the leaders of tomorrow.</p>
<p>But, amidst all the noise, there are some solid gems on that space, I saw a tweet which had a lot of meaning, it reads (paraphrased): &quot;having money and telling yourself you&#39;re broke, is another level of discipline&quot;, and that is what I want to write about today.</p>
<p>I&#39;m not here to tell you the whole mantra on how you should quit your job and start a company, or join a network marketing company that would shoot your finances to the stars. I&#39;m a Nigerian developer and this is what I have to offer to other developers, mostly younger ones. Three things you probably want to take more seriously are</p>
<h2 id="1-savings">1. Savings</h2>
<p>No matter how much you earn, &quot;Put aside a fixed part of your earnings&quot;. I&#39;m not asking you to save so that you can buy your dream computer or a new phone. Neither am I asking you to save so that you can become filthy rich, which is impossible. If you save 100K monthly, it&#39;d take you 10 years to become a millionaire and you can&#39;t be a billionaire in your lifetime, except you plan living for 10 millenniums. No matter how little you earn, put a small portion of it aside.</p>
<p>But, sometimes you really don&#39;t have a savings problem, you have an earning problem. I&#39;ve seen payroll of graduates earning less than what it costs them to survive, in that case... you need to change jobs. No amount of money would ever be enough to survive, you must discipline yourself to live a modest life in your prime.</p>
<p>Some 195million jobs have been lost this year alone (Covid-19 being the official cause for most), always have a good answer fo &quot;If I lost my job today, how many months can I survive without a job&quot;.</p>
<h2 id="2-investment">2. Investment</h2>
<p>The most important kind of investment is to invest in yourself, I&#39;m not just talking about eating good food and wearing nice clothes (good !== expensive). Invest in expanding your domain knowledge, take courses online in your field, learn about other domains, learn about life and anything that might interest you. The purpose of this is to make sure that every day, you wake up as a better person than you were yesterday.</p>
<p>The most important question here is, &quot;What are you doing to make sure your next job would pay you double of your current salary&quot;. Hope isn&#39;t a strategy.</p>
<h2 id="3-retirement">3. Retirement</h2>
<p>This is the other kind of investment, &quot;Your future&quot;. You should have a roadmap for your career and a concise answer to &quot;at what age do you want to retire?&quot;. There are several ways to achieve this, including investing in Agriculture, Stocks, Real estate, Valuable metals, Crypto,  FX among others. Do your research and pick what works best for you.</p>
<p>You might need to finance your investment and retirement from your savings intermittently, however, every month ensure to put something aside for each of this. How you ration depends on your salary, your monthly burn, dependents, et. al. But whatever you do, always put something aside.</p>
]]></content:encoded></item><item><title><![CDATA[The best rejection email I ever received.]]></title><description><![CDATA[I bet you know the feeling of getting rejection letters, but after getting enough of them, I just becomes normal. I've hundreds of rejection letters from different companies for either frontend, backend or full-stack roles. But, one particular one st...]]></description><link>https://blog.amustapha.com/the-best-rejection-email-i-ever-received</link><guid isPermaLink="true">https://blog.amustapha.com/the-best-rejection-email-i-ever-received</guid><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Tue, 26 May 2020 17:47:04 GMT</pubDate><content:encoded><![CDATA[<p>I bet you know the feeling of getting rejection letters, but after getting enough of them, I just becomes normal. I&#39;ve hundreds of rejection letters from different companies for either frontend, backend or full-stack roles. But, one particular one stood out. It wasn&#39;t a rejection, it was feedback, and that&#39;s the kind of HR I&#39;d love to apply to over and over again.</p>
<p>Typical rejection emails read</p>
<blockquote>
<p>Good morning, </p>
<p>Hope this finds you staying safe and healthy.</p>
<p>This is just a quick note to thank you for showing interest in joining the [Company] team. We value that you share the same interest in reimagining how teams work with data and appreciate you taking the time to apply.</p>
<p>Unfortunately we&#39;ve decided not to move forward with your application at this time. We&#39;ll keep your contact details and let you know of future positions (if you&#39;re ok with that). We don&#39;t provide feedback at this stage due to the volume of applications we need to go through. </p>
<p>All the best in your job search and good health in this crazy time.</p>
</blockquote>
<p>And because they all look alike, reading the first line you get the drill and most times don&#39;t have to even read it to the end.</p>
<p>But a company stood out in their rejection. That was one of the dozen rejection letters that I ever followed to the end. It starts</p>
<blockquote>
<p>Hi Abdulhakeem, how are you? I hope you are doing fantastic.</p>
<p>We can give you feedback about the second phase of our selection process:</p>
<p>Since we have found good things in your test, compared to other aspects to improve within the solution that you have implemented. Consequently, we have decided that you won&#39;t be incorporated into the team this time. We hope that you value this experience as a challenge in your professional career and we encourage you to continue advancing and learning :)</p>
<p>...</p>
<h2 id="positive-things">Positive things</h2>
<ul>
<li>The code is correct, easy to read, and the naming is fine.</li>
<li>We appreciate some aspect of your solution that you added such as:</li>
</ul>
<p>...</p>
<h2 id="things-to-improve">Things to Improve</h2>
<ul>
<li>The solution is not production-ready because it&#39;s only configured for an SQLite database. </li>
<li>The code is not scalable.</li>
<li>The endpoint to create users is public. The requirements say that only an admin user can create users.</li>
</ul>
<p>....</p>
<h2 id="recommended-materials">Recommended materials</h2>
<p>If you allow us the suggestion, here you have some books that we like and believe can help you improve:</p>
<ul>
<li>The twelve-factor app (https://12factor.net) - This is a reading that helps a lot to understand what factors are important when developing, configuring, and deploying an application, especially prioritizing aspects such as maintainability or scalability of a software project.</li>
</ul>
<p>...</p>
<p>That’s all, Abdulhakeem. We thank you very much for your effort and the time you have dedicated to this process, and as we already mentioned at the beginning, we would like to remind you that we will receive you if you want to try the test in the future. :D</p>
</blockquote>
<p>If a team can take ample time to review my work and give credible and useful feedback, I&#39;d be willing to take more time to study and put in my best. Do you know companies that are this awesome? Let us know in the comments.</p>
<p><strong>PS: </strong> I edited out some parts of the email, it&#39;s too long, and I&#39;d need consent to put the complete email in public.</p>
]]></content:encoded></item><item><title><![CDATA[I'm not always smart]]></title><description><![CDATA[Social media is a community of people taunting to make you feel mediocre but contrary to the projection of everyone's best, the happiest people I know aren't active on twitter. The smartest people either.
Don't get me wrong, there's a lot of happy an...]]></description><link>https://blog.amustapha.com/im-not-always-smart</link><guid isPermaLink="true">https://blog.amustapha.com/im-not-always-smart</guid><category><![CDATA[motivation]]></category><category><![CDATA[Smalltalk]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Mon, 25 May 2020 07:12:51 GMT</pubDate><content:encoded><![CDATA[<p>Social media is a community of people taunting to make you feel mediocre but contrary to the projection of everyone&#39;s best, the happiest people I know aren&#39;t active on twitter. The smartest people either.</p>
<p>Don&#39;t get me wrong, there&#39;s a lot of happy and smart folks on twitter et. al., but majorly, people are trying to put the best foot forward making you wonder if you&#39;re dumb. As humans, we&#39;re wired to celebrate wins and conceal losses and failure, that projects us to the world as having the &quot;Midas touch&quot;, but in contrast, it makes young and ambitious entry-level engineers feel dumb and intimidated.</p>
<p>I took 2 programming tests over the weekend and I failed both of them. I&#39;m not the type to make excuses, but I&#39;d tell you, I&#39;m not always the guy who seems to have a 200 I.Q, sometimes I have the mind of a toddler. I still write code (almost) every day, and when I&#39;m stressed out, a Fibonacci Implementation might take 2hours to write. Even so, it might still not work fine.</p>
<p>I&#39;m not trying to motivate you, but rather don&#39;t drown in a low self-esteem. The only competition is against yourself, being better than you were yesterday.</p>
]]></content:encoded></item><item><title><![CDATA[Career Advice for Junior Developers]]></title><description><![CDATA[Let me start by wishing you Eid Mubarak. It's a season of peace, joy and happiness and may those never social distance from you. 
I want to give a little advice to Junior developers on accelerating their career. It could be harsh or crazy, but you wo...]]></description><link>https://blog.amustapha.com/career-advice-for-junior-developers</link><guid isPermaLink="true">https://blog.amustapha.com/career-advice-for-junior-developers</guid><category><![CDATA[mentorship]]></category><category><![CDATA[developers]]></category><category><![CDATA[growth]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Sun, 24 May 2020 10:27:19 GMT</pubDate><content:encoded><![CDATA[<p>Let me start by wishing you Eid Mubarak. It&#39;s a season of peace, joy and happiness and may those never social distance from you. </p>
<p>I want to give a little advice to Junior developers on accelerating their career. It could be harsh or crazy, but you would thank me 2 decades from now. The wisdom in here is from advice I&#39;ve received personally and some of the things that work for me.</p>
<p>I have got a ton of mentors and not all of them are in the software industry. But their life story stands the same, their first few jobs out of college wasn&#39;t motivated by money but &quot;career goals&quot;. I got talking with a mentor and he narrated his first job experience out of the University, he studied Marketing and graduated in the 1970s or 80s, can&#39;t really recall. While the bulk of his classmates quickly joined the ranks of large multinational corporations earning large salaries, he helped build a &quot;not so big&quot; company from scratch earning a fraction of what his colleagues earned but was enough to survive on. Two years after graduation, he was one of the few who didn&#39;t have a luxurious car or lived a luxurious lifestyle, it was tough (very tough), but while the next three decades unfold, every bit was worth it.</p>
<p>I&#39;m not narrating you a &quot;rags to riches story&quot;, he was from an average well-to-do family but chose his path carefully and it paid off big time. This article frames an advice he and many others have given me in simpler and &quot;nicer&quot; words.</p>
<p>You probably got out of school at age 22 and you&#39;re looking at spending the next 30 years building a career, supporting a family, leaving your mark on the world and making a lot of money. Personal choices might differ, but it all boils down to wanting to live a fulfilled life.</p>
<p>First, don&#39;t set a &quot;<a target='_blank' rel='noopener noreferrer'  href="https://www.tutorialspoint.com/sdlc/sdlc_waterfall_model.htm">Waterfall model</a> goals&quot;, this might end in regret. When handling issues that have to do with your life, new year resolutions which take you 365 days or 32million seconds to evaluate seems gross, you should break it down to sprints (1-4weeks) and set realistic targets. You don&#39;t want an hourly evaluation of your life either, you&#39;ll just become an analyst with no visible outputs.</p>
<p>Next, have a long term plan, e.g by the end of June, I want to have achieved/completed/earned X, by July I should be good in Y and by 2024 (4 years from now), I should be a Z. Long term goals are important, but making shorter actionable targets keeps you productive and on track.</p>
<p>Don&#39;t compromise your long term goals for short term benefits. You want to be a Google engineer in 5 years but there&#39;s this juicy offer as a bank teller and you spend your evenings hanging out with friends. The term I use to describe such, &quot;Lazy ambitious&quot;</p>
<p>Whatever you do, always build... regardless whether someone would use it or not. It gives you insight you can&#39;t get from watching one thousand hours of youtube videos.</p>
<p>And Finally, you&#39;ll never know enough. Keep in mind that there&#39;s always one more thing (concept, technology, library, framework, plugin, ...) that if you&#39;re to learn would make your life a lot easier, you must find it.</p>
<p><a target='_blank' rel='noopener noreferrer'  href="https://www.linkedin.com/posts/shoaib-habib-memon-96632724_shoaibhabibmemon-ugcPost-6668818394629869568-OqYO">Watch this video on Linkedin: https://www.linkedin.com/posts/shoaib-habib-memon-96632724_shoaibhabibmemon-ugcPost-6668818394629869568-OqYO</a></p>
]]></content:encoded></item><item><title><![CDATA[Free tools that Improve your productivity as a Developer.]]></title><description><![CDATA[Developers argue a lot about language supremacy, but whether you like it or not, they're all here to stay. What I've learnt is to use the right tool for the right job. You don't have to agree with me, but the 5 free tools I'm about to tell you about,...]]></description><link>https://blog.amustapha.com/free-tools-that-improve-your-productivity-as-a-developer</link><guid isPermaLink="true">https://blog.amustapha.com/free-tools-that-improve-your-productivity-as-a-developer</guid><category><![CDATA[tips]]></category><category><![CDATA[Frontend Development]]></category><category><![CDATA[Productivity]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Sat, 23 May 2020 00:17:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1590193320148/TP8ivJ2Yn.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Developers argue a lot about language supremacy, but whether you like it or not, they&#39;re all here to stay. What I&#39;ve learnt is to use the right tool for the right job. You don&#39;t have to agree with me, but the 5 free tools I&#39;m about to tell you about, would make your life a lot easier.</p>
<p>As a fullstack developer, I often find myself sketching interface designs for client approval before spending hours building something that would be eventually discarded. But, my work doesn&#39;t end there. I need to find the best Icons and Images to work with and it&#39;s often not a very easy task. but with the 5 free tools I&#39;m about to share with you, it&#39;s going to be easier than what you&#39;ve been doing all these while.</p>
<h2 id="-1-canva-www-canva-com-https-canva-com-"><a target='_blank' rel='noopener noreferrer'  href="https://canva.com">1.  Canva - www.canva.com</a></h2>
<p>Canva is a pretty easy to navigate tool for some basic image editing and graphics creation. For example, it took me 3 minutes to create the cover image for this story. Yes, 3 minutes. 1 minute to find a good template to work with and the other 2 to modify the text, size and position. I bet that&#39;s not enough time to fire up photoshop 😆. Ofcourse, it&#39;s not half as sophisticated as photoshop, but who needs an aircraft to travel 2 miles? And it&#39;s very easy to learn, even on your own.  <a target='_blank' rel='noopener noreferrer'  href="mailto:duriyahprintandservices6@gmail.com">Duriyah Prints</a>  would teach you the important Canva tricks and shortcuts for next to nothing. You can reach her via: +234 810 862 8501.</p>
<h2 id="-2-icomoon-www-icomoon-io-https-icomoon-io-"><a target='_blank' rel='noopener noreferrer'  href="https://icomoon.io/">2.  IcoMoon - www.icomoon.io</a></h2>
<p>If you really want to make your website fast and light, you might want to choose font-icons over image icons. But, why should you use font-awesome and include 100 extra icons you don&#39;t need just so you can use a few. With IcoMoon, you can select what icons you need to use and download only what you need. Thank me later.</p>
<h2 id="-3-flaticon-www-flaticon-com-http-flaticon-com-"><a target='_blank' rel='noopener noreferrer'  href="http://flaticon.com/">3.  Flaticon - www.flaticon.com</a></h2>
<p>Well, there are some scenarios where font-icons just don&#39;t work or aren&#39;t worth it, those scenarios mostly, you want to have multicoloured icons that are quite sophisticated. Flaticon has nearly 3million different icons for you to choose from. You can download it as a svg or png image, whatever works for you.</p>
<h2 id="-4-freepik-www-freepik-com-https-www-freepik-com-home-"><a target='_blank' rel='noopener noreferrer'  href="https://www.freepik.com/home">4. Freepik - www.freepik.com</a></h2>
<p>Created by the same guys behind flaticons, freepik, on the other hand, gives you a haystack of awesome vector images. You could use them as-is, or import them into your graphics editing tool and modify as you please. Don&#39;t forget to attribute the author though.</p>
<h2 id="-5-unsplash-www-unsplash-com-https-unsplash-com-"><a target='_blank' rel='noopener noreferrer'  href="https://unsplash.com/">5. Unsplash - www.unsplash.com/</a></h2>
<p>Unsplash in their own words is the internet’s source of freely-usable images powered by creators everywhere. What this means, it a site where you can find highres stock images of children playing or people boarding a flight and everything in between. This is especially useful if you&#39;re tired of getting poor quality images from clients which reduces the sophistication of your work.</p>
<p>I hope you find these tools useful, don&#39;t forget to share with friends too.</p>
]]></content:encoded></item><item><title><![CDATA[Best Internet Subscription Deals for Nigerian Developers]]></title><description><![CDATA[Other than the fact that Internet is expensive in Nigeria, and it still sucks, let me tell you a secret: All Nigerian internet service providers have some ridiculously cheap offers that only few are aware of. They rarely advertise them nor are they o...]]></description><link>https://blog.amustapha.com/best-internet-subscription-deals-for-nigerian-developers</link><guid isPermaLink="true">https://blog.amustapha.com/best-internet-subscription-deals-for-nigerian-developers</guid><category><![CDATA[tips]]></category><category><![CDATA[internet]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Fri, 22 May 2020 15:58:03 GMT</pubDate><content:encoded><![CDATA[<p>Other than the fact that Internet is expensive in Nigeria, and it still sucks, let me tell you a secret: All Nigerian internet service providers have some ridiculously cheap offers that only few are aware of. They rarely advertise them nor are they often found on their default data page. I&#39;ll tell you a few tricks I have up my sleeves to get the best data offers.</p>
<p>I&#39;m a practical person, and what guides my value decision for purchasing data on any network boils down to &quot;How much do I pay for every Gigabyte?&quot; and &quot;What extra perks do I get?&quot;. The answer to these 2 questions determines the type of subscription I use. In  <a target='_blank' rel='noopener noreferrer'  href="https://blog.amustapha.com/save-money-on-airtime-recharge-ckagnt9rn00k2mks1ybshpeir">my previous article</a>, I established how I am a heavy data user. For context, I use a minimum of 1GBdaily and my monthly burn is over 100GB 😩 I guess I need to stop streaming. For more context, 100GB should cost you anywhere from 20K up with a 4G router.</p>
<p>The best route for you have in Nigeria is to buy a 4G router most of which are almost free considering the freebies you get with a new router. For example, Airtel gives 110GB for 20,000 naira for the same amount you&#39;d get a  new router loaded with free 100GB, and subsequent months, when you recharge 20,000naira, you get 120GB + 1GB daily when you exhaust it. </p>
<p>But of course, not everyone has 20,000naira to spend upfront on internet subscription, that&#39;s why I put this list together for good deals under ₦5,000. Personally, I always have an active backup subscription and I cannot just spend ₦20,000 with three different service providers. </p>
<table>
<thead>
<tr>
<td><strong> Service Provider </strong></td><td><strong>Value</strong></td><td><strong>Cost </strong></td><td><strong> Validity  </strong></td><td><strong>Code </strong></td></tr>
</thead>
<tbody>
<tr>
<td>MTN</td><td>1GB</td><td>₦200</td><td>1week</td><td>*131*65#</td></tr>
<tr>
<td>MTN</td><td>1GB</td><td>₦335</td><td>1month</td><td><a target='_blank' rel='noopener noreferrer'  href="https://www.clubkonnect.com/Buy.asp">clubkonnect.com</a></td></tr>
<tr>
<td>Airtel</td><td>6GB</td><td>₦1,500</td><td>1week</td><td>*141*1504#</td></tr>
<tr>
<td>MTN</td><td>6GB</td><td>₦1,500</td><td>1week</td><td>*131*143#</td></tr>
<tr>
<td>9mobile</td><td>7GB</td><td>₦1,500</td><td>1week</td><td>*229*2*2#</td></tr>
<tr>
<td>MTN</td><td>20GB</td><td>₦3,500</td><td>1month</td><td>*121*3#</td></tr>
</tbody>
</table>
<p>In case you&#39;re wondering why Glo is missing above, I&#39;m too... 🤣🤣🤣. But seriously, unless you are really patient and can survive on under 200kbps most of the time... it&#39;s not worth it.</p>
<p>If you know any other good value subscriptions, please drop them in the comment section below.</p>
]]></content:encoded></item><item><title><![CDATA[Save money on airtime recharge]]></title><description><![CDATA[I'm a software developer and I spend heavily on airtime and data, you'll eventually find out why. I often have an active subscription with multiple internet service providers, and at some point last year October, my monthly internet spending peaked o...]]></description><link>https://blog.amustapha.com/save-money-on-airtime-recharge</link><guid isPermaLink="true">https://blog.amustapha.com/save-money-on-airtime-recharge</guid><category><![CDATA[tips]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Thu, 21 May 2020 10:56:00 GMT</pubDate><content:encoded><![CDATA[<p>I&#39;m a software developer and I spend heavily on airtime and data, you&#39;ll eventually find out why. I often have an active subscription with multiple internet service providers, and at some point last year October, my monthly internet spending peaked over ₦45,000 monthly and with the tips I&#39;m about to share with you, I have saved up to ₦10,000 naira in a single month.</p>
<blockquote>
<p><strong>NB:</strong> This articles are specifically for Nigerians living in Nigeria.</p>
</blockquote>
<p>I have a suit of apps I specifically use to achieve this, with each app giving me discounts and offers as high usually around 10% but sometimes even higher.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1590057689021/Z0SJs_ARr.jpeg" alt="modems.jpg"></p>
<p>My productivity is very much dependent on good quality internet because almost everything I do from pulling docker images to deploying code, pushing to git, testing deployments and having meetings would leave me frustrated on Glo network 😆. Let&#39;s quickly get started.</p>
<h2 id="5-opay">5. OPay</h2>
<p>Who doesn&#39;t know OPay 😆? For me their glory days are over as they aren&#39;t as generous as they used to be and I don&#39;t use them so much any more, but they still made it to this list because they somehow still manage to give a 2% discount on airtime purchase. 2% is a good deal, but yanks... There&#39;s more where that came from.</p>
<h2 id="4-fairmoney-https-fairmoney-app-link-referral-referral_code-8tu45-">4.  <a target='_blank' rel='noopener noreferrer'  href="https://fairmoney.app.link/referral?referral_code=8TU45">Fairmoney</a></h2>
<p>Fairmoney which is a loan app with bill payment and airtime recharge functionality was at my disposal for quite a while. We were in a long-standing friendship with the Fairmoney app until March 2020 when they reduced airtime discount from 10% to 3%. It&#39;s still a fair deal though, at least better than what OPay offers, but why stay here when you can get more.</p>
<p>By using  <a target='_blank' rel='noopener noreferrer'  href="https://fairmoney.app.link/referral?referral_code=8TU45">my referral link</a>  you should get 500 discount and so do I.</p>
<h2 id="3-jumia-one-https-pay-jumia-com-ng-referrals-invitedby-b3bc8c3d-0553-40df-8f36-ac6d5410751b-">3.  <a target='_blank' rel='noopener noreferrer'  href="https://pay.jumia.com.ng/referrals/?invitedby=b3bc8c3d-0553-40df-8f36-ac6d5410751b">Jumia One</a></h2>
<p>How could I possibly compile this list without JumiaOne... They have been there for me right from the beginning, and though they&#39;re not my No. 1 goto choice today, they still have decent offers. Jumia One, now JumiaPay gives you a 4% <strong>cashback</strong> (note, cashback not discount) on Airtime recharge provided you use the promo code MOB4.</p>
<p>By using  <a target='_blank' rel='noopener noreferrer'  href="https://pay.jumia.com.ng/referrals/?invitedby=b3bc8c3d-0553-40df-8f36-ac6d5410751b">my referral link</a>, you get 20% cashback on your first transaction. I get 500 naira too.</p>
<h2 id="2-palmpay-https-h5-palmpay-app-sign-sign-up-invitqrcode-enk43g-code-0234-scene-palmpay-">2.  <a target='_blank' rel='noopener noreferrer'  href="https://h5.palmpay.app/#/sign/sign-up?invitQrCode=ENK43G&amp;code=0234&amp;scene=PalmPay">Palmpay</a></h2>
<p>The most impressive of these apps is PalmPay, their tagline is &quot;Earn rewards for making payments&quot;. They give a 10% <strong>cashback</strong> (note, cashback not discount) on airtime purchase but not without a catch. You can only use your cashback to finance subsequent recharges up to the tune of 50%. It&#39;s difficult to explain, but say... You recharged 2000 naira, you&#39;ll get 200 palm points cashback after a successful purchase, but you cannot use the entire 200 cashback to buy 200naira airtime without making payment. To use the entire 200 naira, you must either buy a 400 naira airtime and pay extra 200 or use only 100 palm points and pay additional 100naira to buy a 200 naira airtime. If not for this complexity, Palmpay would have been at No. 1.</p>
<h2 id="1-clubkonnect-https-www-clubkonnect-com-">1.  <a target='_blank' rel='noopener noreferrer'  href="https://www.clubkonnect.com/">Clubkonnect</a></h2>
<p>This is my No. 1 airtime recharge app. They give an average 5% discount on recharge with the lowest being MTN at 4% and the highest Glo at 7%. ClubKonnect ranks as my No. 1 because it&#39;s an outright discount, not a cashback and 7% is a great discount second only to Palmpay.</p>
]]></content:encoded></item><item><title><![CDATA[AWS Lambda taught me to write better queries.]]></title><description><![CDATA[If you have experience working in a startup environment, especially bootstrapped ones with no mindblowing valuation or seed funding, you should understand that the most scarce resource is money, and most of the time we spend more time trying to save ...]]></description><link>https://blog.amustapha.com/aws-lambda-taught-me-to-write-better-queries</link><guid isPermaLink="true">https://blog.amustapha.com/aws-lambda-taught-me-to-write-better-queries</guid><category><![CDATA[aws lambda]]></category><category><![CDATA[serverless]]></category><category><![CDATA[Django]]></category><category><![CDATA[startup]]></category><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Wed, 20 May 2020 12:26:51 GMT</pubDate><content:encoded><![CDATA[<p>If you have experience working in a startup environment, especially bootstrapped ones with no mindblowing valuation or seed funding, you should understand that the most scarce resource is money, and most of the time we spend more time trying to save as much money as possible. Our stack is Django, MySQL and VueJS.</p>
<p>We had a dozen customers using one of our products and our server fees were growing by the day and were already hitting $100/mo to get the context, that&#39;s over 36,000 naira. That&#39;s not a lot, but we were struggling with our business model and were barely able to break even let alone make a profit. We had only 2 profitable customers who were considerably large and the other clients were merely consuming more resources. We needed to find ways to cut down our server cost (fast). Taking a look at our server configuration, we were only fully utilizing our servers between 1PM and 4PM when all clients are very active. After then, our server utilization goes down and by 8PM it&#39;s flat at below 5% until the next day when it begins to pick up by 8AM.</p>
<p>Well, it was time for the shift and we began moving to serverless with AWS lambda, the offer seemed juicy and our estimates showed we could cut down our server fees by over 60%, i.e eliminate paying for servers on weekends and at night. Also, we had better availability. Our diamond customer was having their data conversion from their service providers in a few weeks, their data conversion requires importing over 30,000pages of pdf document into the database. By the end of the conversion in a single day, we had nearly 1million database insert queries.</p>
<p>Given that with AWS lambda and aurora, you pay for what you use (execution time, memory, I/O and queries), and we were still testing before fully migrating to lambda, within a few days of repeatedly converting data from pdf, our bill jumped to over $20USD. I&#39;ll outline a few tricks we used to reduce this cost.</p>
<h2 id="1-read-operations-are-cheaper">1. Read operations are cheaper</h2>
<p>Read operations are cheaper to work with than write operations, we had to use read operations to reduce total write operations.</p>
<p>Here&#39;s what I mean; Whenever a new pdf document is uploaded and to be converted, we had to empty our db records and upload entirely new records, &quot;WHY?&quot;, because each new upload invalidates the previous conversion. It&#39;s a bit complex to explain, but imagine a scenario where a hospital receives a list of people who have health insurance coverage and every month, this list changes (either people stop renewing their insurance, are deceased, have been fired or retired from service, or new people are enrolled), other information such as address and age could change and the fastest and most convenient way to go was just invalidate the last upload and create all records afresh.</p>
<p>How we used Read operations was to first check our database for only missing or updated new records and only insert new rows. This reduced the number of write records drastically and hence reduced our cost, but not very significantly.</p>
<h2 id="2-bulk-operations-instead-of-transactions">2. Bulk operations instead of Transactions</h2>
<p>Transactions are able to speed up database writes, especially when you&#39;re writing across several tables. However, with django there&#39;s something even faster</p>
<pre><code class="lang-python"><span class="hljs-keyword">with</span> transaction.atomic():
    [Person.objects.create(**person) <span class="hljs-keyword">for</span> person <span class="hljs-keyword">in</span> people]
</code></pre>
<p>The above snippet is cool, but even better</p>
<pre><code class="lang-python">Person.objects.bulk_create([Person(**person) <span class="hljs-keyword">for</span> person <span class="hljs-keyword">in</span> people])
</code></pre>
<p>Knowing there&#39;s very much more that can be done to improve, I&#39;m still actively learning and if this sort of optimization interests you, a good resource would be  <a target='_blank' rel='noopener noreferrer'  href="https://www.feldroy.com/products/two-scoops-of-django-3-x">Two Scoops of Django 3.x: Best Practices for the Django Web Framework</a> </p>
]]></content:encoded></item><item><title><![CDATA[Basic CRUD with CouchDB/PouchDB]]></title><description><![CDATA[In my  previous post I discussed the basics of setting up CouchDB and PouchDB, in this article I'd like to walk you through some common operations we perform on any database: CRUD (Create-Read-Update-Delete) with CouchDB. I'd also add some SQL refere...]]></description><link>https://blog.amustapha.com/basic-crud-with-couchdbpouchdb</link><guid isPermaLink="true">https://blog.amustapha.com/basic-crud-with-couchdbpouchdb</guid><category><![CDATA[CouchDB]]></category><category><![CDATA[offline]]></category><category><![CDATA[PWA]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Tue, 19 May 2020 17:15:47 GMT</pubDate><content:encoded><![CDATA[<p>In my  <a target='_blank' rel='noopener noreferrer'  href="https://blog.amustapha.com/couchdb-backed-web-apps-for-offline-use-ckae5rpes03vdb6s1qm872i8j">previous post</a> I discussed the basics of setting up CouchDB and PouchDB, in this article I&#39;d like to walk you through some common operations we perform on any database: CRUD (Create-Read-Update-Delete) with CouchDB. I&#39;d also add some SQL reference if you&#39;re coming from an SQL background.</p>
<p>Given that we already have our PouchDB database ready,</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> PouchDB <span class="hljs-keyword">from</span> <span class="hljs-string">'pouchdb'</span>

<span class="hljs-keyword">const</span> db = PouchDB(<span class="hljs-string">'my-offline-db'</span>)
</code></pre>
<h2 id="creating-a-record">Creating a Record</h2>
<p>To create a database record, PouchDB gives us a ready to use interface with self-descriptive methods. Imagine we want to store peoples information based on their twitter handle, we could start by creating a JSON document and calling a post method to create.</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> amustapha = {
   name: <span class="hljs-string">"Abdulhakeem"</span>,
   email: <span class="hljs-string">"abdulhakeemmustatpha@gmail.com"</span>,
   country: <span class="hljs-string">"NG"</span>,
   twitter: <span class="hljs-string">"https://twitter.com/_amustapha"</span>
}
db.post(amustapha)
</code></pre>
<p>The snippet above is like writing the following in SQL</p>
<pre><code class="lang-sql"><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> profile (<span class="hljs-keyword">name</span>, email, country, twitter) 
<span class="hljs-keyword">VALUE</span> (<span class="hljs-string">'Abdulhakeem'</span>, ;abdulhakeemmustapha@gmail.com', 'NG', 'https://twitter.com/_amustapha')
</code></pre>
<p>When the post function is called, our document is automatically assigned an id, unlike SQL which is often auto-incremented, this is a UUID containing up to 32 characters, and the function also returns a promise.</p>
<h2 id="reading-a-record">Reading a Record</h2>
<p>To read a database record, we also would refer to the packed in pouchdb helper function <code>get</code>. To run this function, we&#39;ll need to pass the id of an existing document.</p>
<pre><code class="lang-javascript">db.get(<span class="hljs-string">"unique-doc-id"</span>).then(doc =&gt; {
<span class="hljs-comment">/* you can perform any operation on the document returned. */</span>
    <span class="hljs-built_in">console</span>.log(doc)
})
</code></pre>
<p>The snippet above is like writing the following in SQL</p>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> * <span class="hljs-keyword">FROM</span> profile <span class="hljs-keyword">WHERE</span> <span class="hljs-keyword">id</span> = <span class="hljs-string">'unique-doc-id'</span>
</code></pre>
<h2 id="updating-a-record">Updating a Record</h2>
<p>Once we have read a record from the database, we could modify and save that record. For example, imagine a user changing their email. A helper method for this is <code>put</code></p>
<pre><code class="lang-javascript">db.get(<span class="hljs-string">"unique-doc-id"</span>).then(doc =&gt; {
    doc.email = <span class="hljs-string">"amustapha@hooli.ng"</span>
    db.put(doc)
})
</code></pre>
<p>The snippet above is like writing the following in SQL</p>
<pre><code class="lang-sql"><span class="hljs-keyword">UPDATE</span> profile <span class="hljs-keyword">SET</span> email=<span class="hljs-string">'amustapha@hooli.ng'</span> <span class="hljs-keyword">WHERE</span> <span class="hljs-keyword">id</span> = <span class="hljs-string">'unique-doc-id'</span>
</code></pre>
<h2 id="delete-a-record">Delete a Record</h2>
<p>To delete a database record, simply use the <code>remove</code> function</p>
<pre><code class="lang-javascript">db.remove(<span class="hljs-string">"unique-doc-id"</span>)
</code></pre>
<p>Hope you found this interesting, I&#39;ll be writing other articles to explore CouchDB queries in-depth and some really interesting plugins that would make life a lot easier for you. If you found it interesting, like it and share with friends. </p>
]]></content:encoded></item><item><title><![CDATA[CouchDB backed web-apps for offline use.]]></title><description><![CDATA[The silver bullet for building offline-first web apps is CouchDB. If you read  my previous article about offline first, I mentioned 2 major considerations for offline-first thinking, "persistence" and "syncing", CouchDB provides you with both out of ...]]></description><link>https://blog.amustapha.com/couchdb-backed-web-apps-for-offline-use</link><guid isPermaLink="true">https://blog.amustapha.com/couchdb-backed-web-apps-for-offline-use</guid><category><![CDATA[CouchDB]]></category><category><![CDATA[offline]]></category><category><![CDATA[PWA]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Tue, 19 May 2020 16:56:37 GMT</pubDate><content:encoded><![CDATA[<p>The silver bullet for building offline-first web apps is CouchDB. If you read  <a target='_blank' rel='noopener noreferrer'  href="https://blog.amustapha.com/offline-web-apps-arent-that-hard-ckack38dx02n9b6s12w2ry21u">my previous article</a> about offline first, I mentioned 2 major considerations for offline-first thinking, &quot;persistence&quot; and &quot;syncing&quot;, CouchDB provides you with both out of the box.</p>
<p>As Ryan Meredith goes ahead to say in <a target='_blank' rel='noopener noreferrer'  href="https://blog.couchdb.org/2018/08/21/shifting-from-mysql-to-couchdb-a-user-study/">a CouchDB User Study</a>:</p>
<blockquote>
<p>Even if the internet was very bad our databases in the two locations would eventually sync</p>
</blockquote>
<p>Personally, my love for CouchDB knows no limits, from the mere fact that I can deploy a full application without writing an API since CouchDB ships with an HTTP API, to knowing my app never has downtime. There was an incident from my former startup where we had a billing issue with our server,  we didn&#39;t realize on time and our server was down for nearly 48hours but none of our clients was affected and still had a seamless experience. At another time, we were moving over 1GB of customer data seamlessly every day.</p>
<p>My background has a lot to do with my appreciation of this technology. I worked at a startup in 2016 and was tasked with building a mobile app that works offline. Specifically, a micro-eCommerce app that falls back to use SMS and USSD technology on the background if the internet wasn&#39;t available. Caching the product inventory was a headache. Just like a famous quote any CS student or programmer would probably know: </p>
<blockquote>
<p> There are only two hard things in Computer Science: cache invalidation and naming things</p>
</blockquote>
<p>You might not understand the full complexity of syncing, caching and persistence unless you&#39;ve had to spend hours writing code that isn&#39;t perfect. Imagine accidentally overwriting data and not getting to find out until probably 3 weeks later or never 😩.</p>
<p>To efficiently use CouchDB for offline apps, you have to summon its twin  <a target='_blank' rel='noopener noreferrer'  href="https://pouchdb.com">PouchDB</a>, the difference: 
CouchDB works in the cloud, PouchDB works in your pocket (on your phone, PC or any device), and with CouchDB&#39;s replication protocol, both of these databases would begin to function as one, update one node and all others are updated seamlessly like magic 🤪.</p>
<p>Setting it up is pretty simple</p>
<ol>
<li>Download the latest CouchDB from https://couchdb.apache.org/ or install via terminal following <a target='_blank' rel='noopener noreferrer'  href="https://docs.couchdb.org/en/stable/install/index.html">instructions here</a> that match your operating system.</li>
<li>If in a live environment, you would want to use Nginx for reverse proxy as found  <a target='_blank' rel='noopener noreferrer'  href="https://docs.couchdb.org/en/master/best-practices/reverse-proxies.html">here</a> and set up with a domain e.g couch.example.com</li>
<li>Install  PouchDB  in your javascript app from the  <a target='_blank' rel='noopener noreferrer'  href="https://www.npmjs.com/package/pouchdb">npm package directory</a> </li>
<li>Import and initialize PouchDB</li>
</ol>
<pre><code class="lang-javascript"><span class="hljs-comment">// with commonjs</span>
<span class="hljs-keyword">const</span> PouchDB = <span class="hljs-built_in">require</span>(<span class="hljs-string">'pouchdb'</span>)

<span class="hljs-comment">// or with es6</span>
<span class="hljs-keyword">import</span> PouchDB <span class="hljs-keyword">from</span> <span class="hljs-string">'pouchdb'</span>

<span class="hljs-comment">// create a local database instance and sync</span>
db = PouchDB(<span class="hljs-string">'offline-data-store'</span>)
db.sync(<span class="hljs-string">'https://couch.example.com/online-data-store'</span>)
</code></pre>
]]></content:encoded></item><item><title><![CDATA[Micro-frontend architecture]]></title><description><![CDATA[Being the lead engineer for a small startup delivering accounting software for small and medium businesses (piper.com.ng) mostly around Nothern Nigeria, we were faced with the biggest dilemma yet, almost every client (mostly traders/vendors) did thin...]]></description><link>https://blog.amustapha.com/micro-frontend-architecture</link><guid isPermaLink="true">https://blog.amustapha.com/micro-frontend-architecture</guid><category><![CDATA[offline]]></category><category><![CDATA[PWA]]></category><category><![CDATA[software architecture]]></category><dc:creator><![CDATA[Abdulhakeem Mustapha]]></dc:creator><pubDate>Mon, 18 May 2020 13:26:14 GMT</pubDate><content:encoded><![CDATA[<p>Being the lead engineer for a small startup delivering accounting software for small and medium businesses (piper.com.ng) mostly around Nothern Nigeria, we were faced with the biggest dilemma yet, almost every client (mostly traders/vendors) did things a little differently.</p>
<p>To get the full context, imagine 2 different businesses both selling rice in wholesale. One business might want to enter delivery details such as driver name and vehicle plate number, and another business doesn&#39;t really care. In reality, we&#39;re bringing our software to support their business and not to change their business process. And what made our software unique was simplicity, some of our clients had no formal education but were still able to find their way around, thanks to the minimalist interface and we didn&#39;t want any client to see pages they didn&#39;t interact with. For us to deliver our software solution for a new client (we had under 50 of them) we had to make some minor modifications and view customizations.</p>
<p>We wanted a very functional and customizable software, but as the codebase grew, it became more difficult to keep up with. What we originally did: for each new client we collected their requirements toggled fields from preferences and added more configurable for functionality that doesn&#39;t yet exist. With each new client, we added more form fields and for every form field, we made it configurable. We also had to modify invoice and receipt templates for every client since everyone had details they wanted to appear. The problem became more apparent with clients with entirely different businesses, e.g manufacturing, restaurant, laundry, hotels, etc., we were no longer just toggling form views and reports, but adding entire interfaces to support new operations, it was frustrating.</p>
<p>I had no choice but to start researching the right architecture for a better software that was easy for us to customize and distribute while not compromising performance. What seemed like a silver bullet, was the micro frontend architecture.</p>
<p>I found some interesting resources at https://micro-frontends.org/ and https://single-spa.js.org/, however the problem I had with them is setup complexity... I like to see results pretty fast. https://piral.io is still pretty much in development and it&#39;s mainly targeted for react, (I&#39;m a vueist, vueista, vuer... well, whatever... I write vue), but here are my findings.</p>
<ol>
<li>You can build each part of your application as an independent WebComponent, with Vue, <a target='_blank' rel='noopener noreferrer'  href="https://vuejsdevelopers.com/2018/05/21/vue-js-web-component/">this article</a> is a great place to start.</li>
<li>You can use vue-router, and with dynamic route matching (e.g <code>/apps/:app_name</code>) you can load sub-applications as appropriate. Within each sub-app, you can as well have a routing system in place</li>
<li>In recent browsers, there&#39;s BroadcastChannel which can be used to send messages across sub-apps. <a target='_blank' rel='noopener noreferrer'  href="https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API">This</a> could be resourceful.</li>
<li>BroadcastChannel can handle bi-directional communication.</li>
</ol>
<p>This approach seemed to be the solution we were looking for since</p>
<ol>
<li>We could have outsourced programmers customize components hence making it faster to ship for clients.</li>
<li>Any implementation team could work with whatever technology they&#39;re most comfortable with.</li>
<li>We could add new functionality in production without downtime.</li>
</ol>
<p>I&#39;ll tell you about our experience fixing our problem in the next articles.</p>
]]></content:encoded></item></channel></rss>