


I am a full-stack software engineer from Sydney Australia.
I enjoy building innovative solutions to challenging problems.
My love for programming came from a young age. I was always fascinated about how software worked and how it could be used to solve real-world problems. I eventually started to craft software that I would find useful in my daily life. This passion led me to pursue a degree in computer science and a career in software engineering. This career move has since opened up a world of exciting opportunities for me and has been what I have lived and breathed since.
I currently work full-time as a software engineer at ubank. I occasionally do freelance work to expand my knowledge and skills beyond my day-to-day job. For futher foster creativity, I like to build side projects to expose myself to as many new concepts as possible, do online tutorials or write about my programming experiences on my personal blog.
When I am not developing software, I enjoy spending time with my family, watching sports and doing physical exercise. I believe a balanced life outside of work is important for mental health and is imperative to sustain a long career in software development.

Use Priority Queue. Use Priority Queue is a React hook that provides a simple and efficient way to manage a priority queue in your React applications. It uses a binary heap under the hood, with values stored inside a JavaScript array.

Mirotone React. Mirotone React is a component library for the Mirotone Design System, offering a range of components and utilities to speed up development for Miro. It draws inspiration from Mirotone CSS and Miro UI Components.

Space Manager for Confluence. Space Manager for Confluence gives you a visual overview of your Confluence page structures and how they relate to each other. It simplifies navigation, making it easier for users to understand and collaborate within their Confluence spaces. Space Manager for Confluence originated as a university project in collaboration with the University of Technology Sydney through its Software Development Studio program, evolving into a commercial product now accessible on the Atlassian marketplace.

Dindr. Dindr is a social food discovery application designed to identify commonly favoured restaurants among friends. It assists users in discovering the finest cuisines within a specified location, enabling them to express their interest in restaurants by swiping left or right. Users are then presented with shared restaurant preferences, facilitating groups in refining their selection of dining options.

Dev Journey. Dev Journey is an interactive tool to help developers determine their path toward learning a specific technology or field in tech, whether it's learning about a paradigm, language, framework, or build tool. Dev Journey uses a prompt interface to help users express their goals. In return, the app highlights the paths to reach the user's goal and gives users access to hundreds of resources such as articles, books, courses, documentation, and videos.

Rule Engine TS. Rules Engine TS is a strongly typed rules engine for evaluating deep and complex rules. With the power of Typescript you can create type safe rules that are easy to read and maintain.

Zod Error. Zod Error converts and formats Zod Issues into a customizable error message string that can be consumed by various applications such as front end error message modals or api error messages.

Family Meal Planner. Family Meal Planner is an app to help families plan their meals and automatically generate shopping lists to save time to do better things.

NotionDB. NotionDB is an object modelling tool designed to interface with Notion. It is a tool to allow developers to easily spin up a cloud based database using Notion Databases. Notion Databases consist of a series of Notion Pages (database rows) with various Properties (database columns).

Tempnote. Tempnote is a free open source online service that allows users to send secure and confidential information over the internet. The information automatically self destructs after a defined expiry time. On many platforms provided by big tech, your data can be stored on their servers indefinitely with your data being shared with third party providers. We make it a priority to keep your data safe and secure from prying eyes.

City Sniffers. City Sniffers is a B2C (Business to customer) app used to manage dog walks and communicate with clients of the City Sniffers dog walking business. The app had over 70 daily users. Features include a social feed, shop, credit management, bookings, chat and live notifications. The app uses the React Native CLI, NodeJS, Firestore for the code base and leverages off third party APIs such as Square (for payments) and SendInBlue (for email notifications).

VSP Intranet. VSP Intranet was created for VSP Solutions to solve common communication and business problems internally. Their internal systems were scattered across many different platforms and a lot of information was duplicated as a result.

RuffnTumble. RuffnTumble is a social network for dog owners socialise with other dog owners in the same area. Features include Finding a dog location (such as dog parks, beaches, vets etc.), Track a dog walk, Reminders (for vaccinations, dog walks etc.) and Social interaction with nearby dog owners. It uses the Expo API to take advantage of the various helper APIs to tap into phone functions such as the Camera and GPS.

Use Priority Queue. Use Priority Queue is a React hook that provides a simple and efficient way to manage a priority queue in your React applications. It uses a binary heap under the hood, with values stored inside a JavaScript array.

Mirotone React. Mirotone React is a component library for the Mirotone Design System, offering a range of components and utilities to speed up development for Miro. It draws inspiration from Mirotone CSS and Miro UI Components.

Space Manager for Confluence. Space Manager for Confluence gives you a visual overview of your Confluence page structures and how they relate to each other. It simplifies navigation, making it easier for users to understand and collaborate within their Confluence spaces. Space Manager for Confluence originated as a university project in collaboration with the University of Technology Sydney through its Software Development Studio program, evolving into a commercial product now accessible on the Atlassian marketplace.

Dindr. Dindr is a social food discovery application designed to identify commonly favoured restaurants among friends. It assists users in discovering the finest cuisines within a specified location, enabling them to express their interest in restaurants by swiping left or right. Users are then presented with shared restaurant preferences, facilitating groups in refining their selection of dining options.

Dev Journey. Dev Journey is an interactive tool to help developers determine their path toward learning a specific technology or field in tech, whether it's learning about a paradigm, language, framework, or build tool. Dev Journey uses a prompt interface to help users express their goals. In return, the app highlights the paths to reach the user's goal and gives users access to hundreds of resources such as articles, books, courses, documentation, and videos.

Rule Engine TS. Rules Engine TS is a strongly typed rules engine for evaluating deep and complex rules. With the power of Typescript you can create type safe rules that are easy to read and maintain.

Zod Error. Zod Error converts and formats Zod Issues into a customizable error message string that can be consumed by various applications such as front end error message modals or api error messages.

Family Meal Planner. Family Meal Planner is an app to help families plan their meals and automatically generate shopping lists to save time to do better things.

NotionDB. NotionDB is an object modelling tool designed to interface with Notion. It is a tool to allow developers to easily spin up a cloud based database using Notion Databases. Notion Databases consist of a series of Notion Pages (database rows) with various Properties (database columns).

Tempnote. Tempnote is a free open source online service that allows users to send secure and confidential information over the internet. The information automatically self destructs after a defined expiry time. On many platforms provided by big tech, your data can be stored on their servers indefinitely with your data being shared with third party providers. We make it a priority to keep your data safe and secure from prying eyes.

City Sniffers. City Sniffers is a B2C (Business to customer) app used to manage dog walks and communicate with clients of the City Sniffers dog walking business. The app had over 70 daily users. Features include a social feed, shop, credit management, bookings, chat and live notifications. The app uses the React Native CLI, NodeJS, Firestore for the code base and leverages off third party APIs such as Square (for payments) and SendInBlue (for email notifications).

VSP Intranet. VSP Intranet was created for VSP Solutions to solve common communication and business problems internally. Their internal systems were scattered across many different platforms and a lot of information was duplicated as a result.

RuffnTumble. RuffnTumble is a social network for dog owners socialise with other dog owners in the same area. Features include Finding a dog location (such as dog parks, beaches, vets etc.), Track a dog walk, Reminders (for vaccinations, dog walks etc.) and Social interaction with nearby dog owners. It uses the Expo API to take advantage of the various helper APIs to tap into phone functions such as the Camera and GPS.

Use Priority Queue. Use Priority Queue is a React hook that provides a simple and efficient way to manage a priority queue in your React applications. It uses a binary heap under the hood, with values stored inside a JavaScript array.

Mirotone React. Mirotone React is a component library for the Mirotone Design System, offering a range of components and utilities to speed up development for Miro. It draws inspiration from Mirotone CSS and Miro UI Components.

Space Manager for Confluence. Space Manager for Confluence gives you a visual overview of your Confluence page structures and how they relate to each other. It simplifies navigation, making it easier for users to understand and collaborate within their Confluence spaces. Space Manager for Confluence originated as a university project in collaboration with the University of Technology Sydney through its Software Development Studio program, evolving into a commercial product now accessible on the Atlassian marketplace.

Dindr. Dindr is a social food discovery application designed to identify commonly favoured restaurants among friends. It assists users in discovering the finest cuisines within a specified location, enabling them to express their interest in restaurants by swiping left or right. Users are then presented with shared restaurant preferences, facilitating groups in refining their selection of dining options.

Dev Journey. Dev Journey is an interactive tool to help developers determine their path toward learning a specific technology or field in tech, whether it's learning about a paradigm, language, framework, or build tool. Dev Journey uses a prompt interface to help users express their goals. In return, the app highlights the paths to reach the user's goal and gives users access to hundreds of resources such as articles, books, courses, documentation, and videos.

Rule Engine TS. Rules Engine TS is a strongly typed rules engine for evaluating deep and complex rules. With the power of Typescript you can create type safe rules that are easy to read and maintain.

Zod Error. Zod Error converts and formats Zod Issues into a customizable error message string that can be consumed by various applications such as front end error message modals or api error messages.

Family Meal Planner. Family Meal Planner is an app to help families plan their meals and automatically generate shopping lists to save time to do better things.

NotionDB. NotionDB is an object modelling tool designed to interface with Notion. It is a tool to allow developers to easily spin up a cloud based database using Notion Databases. Notion Databases consist of a series of Notion Pages (database rows) with various Properties (database columns).

Tempnote. Tempnote is a free open source online service that allows users to send secure and confidential information over the internet. The information automatically self destructs after a defined expiry time. On many platforms provided by big tech, your data can be stored on their servers indefinitely with your data being shared with third party providers. We make it a priority to keep your data safe and secure from prying eyes.

City Sniffers. City Sniffers is a B2C (Business to customer) app used to manage dog walks and communicate with clients of the City Sniffers dog walking business. The app had over 70 daily users. Features include a social feed, shop, credit management, bookings, chat and live notifications. The app uses the React Native CLI, NodeJS, Firestore for the code base and leverages off third party APIs such as Square (for payments) and SendInBlue (for email notifications).

VSP Intranet. VSP Intranet was created for VSP Solutions to solve common communication and business problems internally. Their internal systems were scattered across many different platforms and a lot of information was duplicated as a result.

RuffnTumble. RuffnTumble is a social network for dog owners socialise with other dog owners in the same area. Features include Finding a dog location (such as dog parks, beaches, vets etc.), Track a dog walk, Reminders (for vaccinations, dog walks etc.) and Social interaction with nearby dog owners. It uses the Expo API to take advantage of the various helper APIs to tap into phone functions such as the Camera and GPS.

Don't Skip the Learning Journey. With the rapid rise of artificial intelligence, there has never been a better time to produce digital products so quickly and with so little expertise. Artificial intelligence has enabled non-technical thinkers to create products with their imagination and ship them to production. As programmers, we are inherently curious about how things work and why. After all, what we do is program, not command and verify. Artificial intelligence has robbed us of the ability to be curious and, inevitably, skipped the learning journey.

Fighting off Automated Bots. So, a couple of weeks ago, I started receiving numerous email notifications for people signing up for my newsletter. Initially, I thought nothing of it. Perhaps my LinkedIn profile got a few extra views for whatever reason.

Dogfooding my own Todo List. I recently embarked on a journey to create a to-do list to manage shopping lists between my wife and me. As part of managing a family, it is important for my wife and me to be able to collaborate on shopping lists to ensure we can effectively purchase everything we need to make the family function.

Finding a Tech Job is Hard. Let me take you through my journey of looking for a software engineering job this year. Although it was long and arduous, I got a lot out of it, including sharpening my technical skills, refreshing my data structures and algorithms, learning system design from the ground up, reflecting on my past jobs, what my behavioural flaws are, where I am at in my career and what I am looking for in my future job.

Using a Priority Queue to Orchestrate Animations. I have some interesting logic on my Blog Posts page that animates a Blog Post card onto the screen upon being visible to the user. The intended effect I required was for the Blog Post cards to animate into the screen one after another. This is not an easy task as Blog Post cards are unaware of what row they sit in, or even what index they are (and nor should they). They should be agnostic as to whether they are rendered in a list, grid or as a singular entity. This is one of the keys to building reusable components.

Implementing a Newsletter Feature on my Website. To get more eyeballs on my blog posts, I decided my website needed a newsletter feature to notify readers when a new blog post was published. I pondered using a service such as MailChimp but did the most developer thing possible. I rolled my own. Don't get me wrong, there are many advantages of using a tried and tested platform to handle my newsletter but what fun would that be? Not to mention, I would get zero learning experience from doing that.

How Maintaining React Native Dependencies Benefits the Customer. Recently, I performed routine maintenance on a customer's mobile app. This coincided with the release of React Native 0.76. This wasn't your regular run-of-the-mill dependencies upgrade. This involved a major app architecture upgrade.

JavaScript Memoization. Last week at work, we implemented a caching mechanism for Chargebee API calls so that we could avoid API restrictions with Chargebee. This meant that we could memorize the result of an API call in our persistent store.

Parallelism VS Concurrency. With JavaScript being a single-threaded language, it never occurred to me how limiting this fundamental flaw was until I kept hearing about how advantageous languages such as Java, Rust and Go handled concurrency. To me, firing off multiple promises in JavaScript was good enough. Not until I experienced limitations around synchronous blocking code in React and how it affected the user's experience. This is when I started to explore why a single-threaded language simply cannot handle parallel processing well.

A Calculator Built with Function Chaining. The motivation to implement a calculator using function chaining is to demonstrate how this pattern can improve code readability and can logically process actions from left to right. Here is a simple example of how some calculations are implemented with the use of pure functions:

JavaScript's Array Reduce: Mutable vs. Immutable Accumulators. JavaScript's reduce array method can be incredibly useful in data transformations and building data structures, while at the same time iterating through an existing data structure. It is great for building arrays, objects, strings, or keeping an integer count.

I Built a Rule Engine. I was working on a React Native project that required my app to give the user a convenient way to filter payloads based on certain criteria of each field. I started building a data structure, then the methods to consume the data structures. Before I knew it, I had taken on a side quest inside my app.

Levels of Infrastructure Deployment. Early last year I worked on a personal full stack project using AWS Amplify. I had abandoned the project since, and only recently decided to revive it. The issue that I ran into was that I had already deleted the existing resources off AWS and the Amplify codebase was still referencing those references.

Never Trust the Backend. Whenever fetching data from a backend server, you may be naive enough to think that the response is always predictable and your data's shape will always be the same.

My Favourite Underrated VS Code Extensions. There are the "must have" VS Code extensions that we all install as soon as we set up VS Code such as ESLint, Prettier etc. Today I am going to share my favourite lesser known extensions and how they help my software development workflow.

React: Avoid Unnecessary Renders with Batch State Updates. Have you ever wondered why your component is re-rendering multiple time consecutively when you only expect it to re-render once? Perhaps you update some local state and somehow multiple renders occur as a result? Lets take this hooks based example:

Foolproof Patterns for Handling Date & Time. Date and time can be tricky when you consider time zones, client side vs server side time and determining the best patterns for handling database records based on date and time. Considerations on how to store date and time server side usually comes down to how easy it is to retrieve a record based on some time fields, how easy it is to manipulate and how readable the format is.

Tutorial: Tinder-like Swipe Cards. Today we will be implementing Tinder like swipe cards in React Native using react-native's Animated API and PanResponder API. Disclaimer: the animations are created on the JavaScript thread and can be moved to the UI Thread using react-native-reanimated instead.

Refactoring a Live App to TypeScript. So recently, one of my clients had asked for some new features for a Dog Walking mobile app that was deployed earlier this year. I hadn't touched the code base in months and when I re-opened the code base to see how I would implement these features, it dawned on me that it was a bit of a dumpster fire 🔥. Keeping in mind that this was written about a year ago, a time where my programming skills weren't anywhere as polished as it is today. I decided, that the only way moving forward (with confidence) was to upgrade both the backend (Node.js/JavaScript) and frontend (React Native/JavaScript) to TypeScript.

Programming Paradigms: Procedural vs. Object Oriented vs. Functional. Programming paradigms refer to the style of programming you choose to implement in your codebase. The paradigms are a way to logically write and structure your code. It is not a strict set of rules set by your browser, IDE or compiler, however certain languages or frameworks may be opinionated about which paradigm is preferred. We will be exploring three paradigms with working examples and comparisons. Firstly, a general overview of each paradigm:

Twilio Sendgrid vs. SendInBlue vs. Amazon SES. Whether you need to send a few emails a day or up to a million emails a month, these cloud SMTP services can provide a scalable and secure solution to meet your business needs. Today I will be exploring these 3 services, my experiences with them and which one should be used for which purpose in your app. There are of course many more services such as Mailgun, Mailjet, Mailchimp, however I do not have experience using these services therefore I cannot speak on them. For this comparison I will be using transactional emails as my use case. Transactional emails are emails that are triggered by a backend server upon an action such as a user signing up for an account, a password recovery email or sending an invoice upon an online purchase.

Why Exercise Helps Me Code. Every time I have been in a rut or found myself struggling to solve a problem, usually the last thing I want to do is to stop thinking about the problem. Sometimes I get obsessive, lose sleep and can barely focus on anything else. It's like I cannot move past GO until I get it sorted. 😫

I Converted My Website to Next.js. Ever since I learnt how to create websites using React, my go to boilerplate starter code was to use Create React App. It is the easiest way to learn React and the fastest way to get a website up and running. After creating my own website using Create React App, I quickly found the pitfalls of having a client rendered SPA (Single Page Application).

Never Using JavaScript Again. Ok, the title is a bit dramatic, but I thought it would be fun to try this click bait thing. Now that I have your attention, I want to explain why I moved from JavaScript to TypeScript. For all of those living under a rock (much like myself up until now), TypeScript is a superset of JavaScript which gives JavaScript super powers to eliminate bugs during development time. It is basically JavaScript on steroids.

Deploying My First Mobile App. After 4 long months and 475 hours of development I have finally deployed my first mobile app to their respective app stores. In the grand scheme of things I am not sure if this is a long time for developing a mobile app or if it's a relatively quick development lifecycle. To get closer to a definitive answer, i'll break down what the app is and what's its scope, what technologies I used to create the app, the motivation behind the app and what I hope to get out of creating the app.

Tech I am Learning in 2021. This year I will be looking to level up my web development game on the front end as well as the back end. Now that I have a foundational understanding of front end frameworks, back end frameworks and mobile development, this year I want to dig deeper into these nooks so I can move past being just an everyday web developer.

2020: Year in Review. Wow, what a year 2020 has been. It's been weird, whacky and strangely wonderful. Amongst all the chaos that was put forth in the world, some how I found order.

Why I Ditched Expo. Expo is a great third party wrapper for React Native that aids the speed of development and deployment. The Expo SDK provides developers with a lot of mobile native features out of the box and does all the heavy lifting. Another great feature of Expo is the ability use their mobile app to test your app on real devices without having to use Android Studio or XCode.

My First Tech Interview Experience. So three weeks ago I landed my first Software Development job interview. I was recommended by a fellow friend that I met at University this semester. It was for a a role as a Junior Software Developer.

Replacing Moment.js with Alternatives. In September Moment.js officially declared their project entered maintenance mode. This means that no further development would be done and that users should find an alternative.

Hello World. Welcome to my personal website. Thank you for taking the time to join me on my journey as a software developer. My website will be used as a playground to share thoughts and ideas, check out the awesome projects I'm involved with, and read my blog posts about absolutely anything.

Don't Skip the Learning Journey. With the rapid rise of artificial intelligence, there has never been a better time to produce digital products so quickly and with so little expertise. Artificial intelligence has enabled non-technical thinkers to create products with their imagination and ship them to production. As programmers, we are inherently curious about how things work and why. After all, what we do is program, not command and verify. Artificial intelligence has robbed us of the ability to be curious and, inevitably, skipped the learning journey.

Fighting off Automated Bots. So, a couple of weeks ago, I started receiving numerous email notifications for people signing up for my newsletter. Initially, I thought nothing of it. Perhaps my LinkedIn profile got a few extra views for whatever reason.

Dogfooding my own Todo List. I recently embarked on a journey to create a to-do list to manage shopping lists between my wife and me. As part of managing a family, it is important for my wife and me to be able to collaborate on shopping lists to ensure we can effectively purchase everything we need to make the family function.

Finding a Tech Job is Hard. Let me take you through my journey of looking for a software engineering job this year. Although it was long and arduous, I got a lot out of it, including sharpening my technical skills, refreshing my data structures and algorithms, learning system design from the ground up, reflecting on my past jobs, what my behavioural flaws are, where I am at in my career and what I am looking for in my future job.

Using a Priority Queue to Orchestrate Animations. I have some interesting logic on my Blog Posts page that animates a Blog Post card onto the screen upon being visible to the user. The intended effect I required was for the Blog Post cards to animate into the screen one after another. This is not an easy task as Blog Post cards are unaware of what row they sit in, or even what index they are (and nor should they). They should be agnostic as to whether they are rendered in a list, grid or as a singular entity. This is one of the keys to building reusable components.

Implementing a Newsletter Feature on my Website. To get more eyeballs on my blog posts, I decided my website needed a newsletter feature to notify readers when a new blog post was published. I pondered using a service such as MailChimp but did the most developer thing possible. I rolled my own. Don't get me wrong, there are many advantages of using a tried and tested platform to handle my newsletter but what fun would that be? Not to mention, I would get zero learning experience from doing that.

How Maintaining React Native Dependencies Benefits the Customer. Recently, I performed routine maintenance on a customer's mobile app. This coincided with the release of React Native 0.76. This wasn't your regular run-of-the-mill dependencies upgrade. This involved a major app architecture upgrade.

JavaScript Memoization. Last week at work, we implemented a caching mechanism for Chargebee API calls so that we could avoid API restrictions with Chargebee. This meant that we could memorize the result of an API call in our persistent store.

Parallelism VS Concurrency. With JavaScript being a single-threaded language, it never occurred to me how limiting this fundamental flaw was until I kept hearing about how advantageous languages such as Java, Rust and Go handled concurrency. To me, firing off multiple promises in JavaScript was good enough. Not until I experienced limitations around synchronous blocking code in React and how it affected the user's experience. This is when I started to explore why a single-threaded language simply cannot handle parallel processing well.

A Calculator Built with Function Chaining. The motivation to implement a calculator using function chaining is to demonstrate how this pattern can improve code readability and can logically process actions from left to right. Here is a simple example of how some calculations are implemented with the use of pure functions:

JavaScript's Array Reduce: Mutable vs. Immutable Accumulators. JavaScript's reduce array method can be incredibly useful in data transformations and building data structures, while at the same time iterating through an existing data structure. It is great for building arrays, objects, strings, or keeping an integer count.

I Built a Rule Engine. I was working on a React Native project that required my app to give the user a convenient way to filter payloads based on certain criteria of each field. I started building a data structure, then the methods to consume the data structures. Before I knew it, I had taken on a side quest inside my app.

Levels of Infrastructure Deployment. Early last year I worked on a personal full stack project using AWS Amplify. I had abandoned the project since, and only recently decided to revive it. The issue that I ran into was that I had already deleted the existing resources off AWS and the Amplify codebase was still referencing those references.

Never Trust the Backend. Whenever fetching data from a backend server, you may be naive enough to think that the response is always predictable and your data's shape will always be the same.

My Favourite Underrated VS Code Extensions. There are the "must have" VS Code extensions that we all install as soon as we set up VS Code such as ESLint, Prettier etc. Today I am going to share my favourite lesser known extensions and how they help my software development workflow.

React: Avoid Unnecessary Renders with Batch State Updates. Have you ever wondered why your component is re-rendering multiple time consecutively when you only expect it to re-render once? Perhaps you update some local state and somehow multiple renders occur as a result? Lets take this hooks based example:

Foolproof Patterns for Handling Date & Time. Date and time can be tricky when you consider time zones, client side vs server side time and determining the best patterns for handling database records based on date and time. Considerations on how to store date and time server side usually comes down to how easy it is to retrieve a record based on some time fields, how easy it is to manipulate and how readable the format is.

Tutorial: Tinder-like Swipe Cards. Today we will be implementing Tinder like swipe cards in React Native using react-native's Animated API and PanResponder API. Disclaimer: the animations are created on the JavaScript thread and can be moved to the UI Thread using react-native-reanimated instead.

Refactoring a Live App to TypeScript. So recently, one of my clients had asked for some new features for a Dog Walking mobile app that was deployed earlier this year. I hadn't touched the code base in months and when I re-opened the code base to see how I would implement these features, it dawned on me that it was a bit of a dumpster fire 🔥. Keeping in mind that this was written about a year ago, a time where my programming skills weren't anywhere as polished as it is today. I decided, that the only way moving forward (with confidence) was to upgrade both the backend (Node.js/JavaScript) and frontend (React Native/JavaScript) to TypeScript.

Programming Paradigms: Procedural vs. Object Oriented vs. Functional. Programming paradigms refer to the style of programming you choose to implement in your codebase. The paradigms are a way to logically write and structure your code. It is not a strict set of rules set by your browser, IDE or compiler, however certain languages or frameworks may be opinionated about which paradigm is preferred. We will be exploring three paradigms with working examples and comparisons. Firstly, a general overview of each paradigm:

Twilio Sendgrid vs. SendInBlue vs. Amazon SES. Whether you need to send a few emails a day or up to a million emails a month, these cloud SMTP services can provide a scalable and secure solution to meet your business needs. Today I will be exploring these 3 services, my experiences with them and which one should be used for which purpose in your app. There are of course many more services such as Mailgun, Mailjet, Mailchimp, however I do not have experience using these services therefore I cannot speak on them. For this comparison I will be using transactional emails as my use case. Transactional emails are emails that are triggered by a backend server upon an action such as a user signing up for an account, a password recovery email or sending an invoice upon an online purchase.

Why Exercise Helps Me Code. Every time I have been in a rut or found myself struggling to solve a problem, usually the last thing I want to do is to stop thinking about the problem. Sometimes I get obsessive, lose sleep and can barely focus on anything else. It's like I cannot move past GO until I get it sorted. 😫

I Converted My Website to Next.js. Ever since I learnt how to create websites using React, my go to boilerplate starter code was to use Create React App. It is the easiest way to learn React and the fastest way to get a website up and running. After creating my own website using Create React App, I quickly found the pitfalls of having a client rendered SPA (Single Page Application).

Never Using JavaScript Again. Ok, the title is a bit dramatic, but I thought it would be fun to try this click bait thing. Now that I have your attention, I want to explain why I moved from JavaScript to TypeScript. For all of those living under a rock (much like myself up until now), TypeScript is a superset of JavaScript which gives JavaScript super powers to eliminate bugs during development time. It is basically JavaScript on steroids.

Deploying My First Mobile App. After 4 long months and 475 hours of development I have finally deployed my first mobile app to their respective app stores. In the grand scheme of things I am not sure if this is a long time for developing a mobile app or if it's a relatively quick development lifecycle. To get closer to a definitive answer, i'll break down what the app is and what's its scope, what technologies I used to create the app, the motivation behind the app and what I hope to get out of creating the app.

Tech I am Learning in 2021. This year I will be looking to level up my web development game on the front end as well as the back end. Now that I have a foundational understanding of front end frameworks, back end frameworks and mobile development, this year I want to dig deeper into these nooks so I can move past being just an everyday web developer.

2020: Year in Review. Wow, what a year 2020 has been. It's been weird, whacky and strangely wonderful. Amongst all the chaos that was put forth in the world, some how I found order.

Why I Ditched Expo. Expo is a great third party wrapper for React Native that aids the speed of development and deployment. The Expo SDK provides developers with a lot of mobile native features out of the box and does all the heavy lifting. Another great feature of Expo is the ability use their mobile app to test your app on real devices without having to use Android Studio or XCode.

My First Tech Interview Experience. So three weeks ago I landed my first Software Development job interview. I was recommended by a fellow friend that I met at University this semester. It was for a a role as a Junior Software Developer.

Replacing Moment.js with Alternatives. In September Moment.js officially declared their project entered maintenance mode. This means that no further development would be done and that users should find an alternative.

Hello World. Welcome to my personal website. Thank you for taking the time to join me on my journey as a software developer. My website will be used as a playground to share thoughts and ideas, check out the awesome projects I'm involved with, and read my blog posts about absolutely anything.

Don't Skip the Learning Journey. With the rapid rise of artificial intelligence, there has never been a better time to produce digital products so quickly and with so little expertise. Artificial intelligence has enabled non-technical thinkers to create products with their imagination and ship them to production. As programmers, we are inherently curious about how things work and why. After all, what we do is program, not command and verify. Artificial intelligence has robbed us of the ability to be curious and, inevitably, skipped the learning journey.

Fighting off Automated Bots. So, a couple of weeks ago, I started receiving numerous email notifications for people signing up for my newsletter. Initially, I thought nothing of it. Perhaps my LinkedIn profile got a few extra views for whatever reason.

Dogfooding my own Todo List. I recently embarked on a journey to create a to-do list to manage shopping lists between my wife and me. As part of managing a family, it is important for my wife and me to be able to collaborate on shopping lists to ensure we can effectively purchase everything we need to make the family function.

Finding a Tech Job is Hard. Let me take you through my journey of looking for a software engineering job this year. Although it was long and arduous, I got a lot out of it, including sharpening my technical skills, refreshing my data structures and algorithms, learning system design from the ground up, reflecting on my past jobs, what my behavioural flaws are, where I am at in my career and what I am looking for in my future job.

Using a Priority Queue to Orchestrate Animations. I have some interesting logic on my Blog Posts page that animates a Blog Post card onto the screen upon being visible to the user. The intended effect I required was for the Blog Post cards to animate into the screen one after another. This is not an easy task as Blog Post cards are unaware of what row they sit in, or even what index they are (and nor should they). They should be agnostic as to whether they are rendered in a list, grid or as a singular entity. This is one of the keys to building reusable components.

Implementing a Newsletter Feature on my Website. To get more eyeballs on my blog posts, I decided my website needed a newsletter feature to notify readers when a new blog post was published. I pondered using a service such as MailChimp but did the most developer thing possible. I rolled my own. Don't get me wrong, there are many advantages of using a tried and tested platform to handle my newsletter but what fun would that be? Not to mention, I would get zero learning experience from doing that.

How Maintaining React Native Dependencies Benefits the Customer. Recently, I performed routine maintenance on a customer's mobile app. This coincided with the release of React Native 0.76. This wasn't your regular run-of-the-mill dependencies upgrade. This involved a major app architecture upgrade.

JavaScript Memoization. Last week at work, we implemented a caching mechanism for Chargebee API calls so that we could avoid API restrictions with Chargebee. This meant that we could memorize the result of an API call in our persistent store.

Parallelism VS Concurrency. With JavaScript being a single-threaded language, it never occurred to me how limiting this fundamental flaw was until I kept hearing about how advantageous languages such as Java, Rust and Go handled concurrency. To me, firing off multiple promises in JavaScript was good enough. Not until I experienced limitations around synchronous blocking code in React and how it affected the user's experience. This is when I started to explore why a single-threaded language simply cannot handle parallel processing well.

A Calculator Built with Function Chaining. The motivation to implement a calculator using function chaining is to demonstrate how this pattern can improve code readability and can logically process actions from left to right. Here is a simple example of how some calculations are implemented with the use of pure functions:

JavaScript's Array Reduce: Mutable vs. Immutable Accumulators. JavaScript's reduce array method can be incredibly useful in data transformations and building data structures, while at the same time iterating through an existing data structure. It is great for building arrays, objects, strings, or keeping an integer count.

I Built a Rule Engine. I was working on a React Native project that required my app to give the user a convenient way to filter payloads based on certain criteria of each field. I started building a data structure, then the methods to consume the data structures. Before I knew it, I had taken on a side quest inside my app.

Levels of Infrastructure Deployment. Early last year I worked on a personal full stack project using AWS Amplify. I had abandoned the project since, and only recently decided to revive it. The issue that I ran into was that I had already deleted the existing resources off AWS and the Amplify codebase was still referencing those references.

Never Trust the Backend. Whenever fetching data from a backend server, you may be naive enough to think that the response is always predictable and your data's shape will always be the same.

My Favourite Underrated VS Code Extensions. There are the "must have" VS Code extensions that we all install as soon as we set up VS Code such as ESLint, Prettier etc. Today I am going to share my favourite lesser known extensions and how they help my software development workflow.

React: Avoid Unnecessary Renders with Batch State Updates. Have you ever wondered why your component is re-rendering multiple time consecutively when you only expect it to re-render once? Perhaps you update some local state and somehow multiple renders occur as a result? Lets take this hooks based example:

Foolproof Patterns for Handling Date & Time. Date and time can be tricky when you consider time zones, client side vs server side time and determining the best patterns for handling database records based on date and time. Considerations on how to store date and time server side usually comes down to how easy it is to retrieve a record based on some time fields, how easy it is to manipulate and how readable the format is.

Tutorial: Tinder-like Swipe Cards. Today we will be implementing Tinder like swipe cards in React Native using react-native's Animated API and PanResponder API. Disclaimer: the animations are created on the JavaScript thread and can be moved to the UI Thread using react-native-reanimated instead.

Refactoring a Live App to TypeScript. So recently, one of my clients had asked for some new features for a Dog Walking mobile app that was deployed earlier this year. I hadn't touched the code base in months and when I re-opened the code base to see how I would implement these features, it dawned on me that it was a bit of a dumpster fire 🔥. Keeping in mind that this was written about a year ago, a time where my programming skills weren't anywhere as polished as it is today. I decided, that the only way moving forward (with confidence) was to upgrade both the backend (Node.js/JavaScript) and frontend (React Native/JavaScript) to TypeScript.

Programming Paradigms: Procedural vs. Object Oriented vs. Functional. Programming paradigms refer to the style of programming you choose to implement in your codebase. The paradigms are a way to logically write and structure your code. It is not a strict set of rules set by your browser, IDE or compiler, however certain languages or frameworks may be opinionated about which paradigm is preferred. We will be exploring three paradigms with working examples and comparisons. Firstly, a general overview of each paradigm:

Twilio Sendgrid vs. SendInBlue vs. Amazon SES. Whether you need to send a few emails a day or up to a million emails a month, these cloud SMTP services can provide a scalable and secure solution to meet your business needs. Today I will be exploring these 3 services, my experiences with them and which one should be used for which purpose in your app. There are of course many more services such as Mailgun, Mailjet, Mailchimp, however I do not have experience using these services therefore I cannot speak on them. For this comparison I will be using transactional emails as my use case. Transactional emails are emails that are triggered by a backend server upon an action such as a user signing up for an account, a password recovery email or sending an invoice upon an online purchase.

Why Exercise Helps Me Code. Every time I have been in a rut or found myself struggling to solve a problem, usually the last thing I want to do is to stop thinking about the problem. Sometimes I get obsessive, lose sleep and can barely focus on anything else. It's like I cannot move past GO until I get it sorted. 😫

I Converted My Website to Next.js. Ever since I learnt how to create websites using React, my go to boilerplate starter code was to use Create React App. It is the easiest way to learn React and the fastest way to get a website up and running. After creating my own website using Create React App, I quickly found the pitfalls of having a client rendered SPA (Single Page Application).

Never Using JavaScript Again. Ok, the title is a bit dramatic, but I thought it would be fun to try this click bait thing. Now that I have your attention, I want to explain why I moved from JavaScript to TypeScript. For all of those living under a rock (much like myself up until now), TypeScript is a superset of JavaScript which gives JavaScript super powers to eliminate bugs during development time. It is basically JavaScript on steroids.

Deploying My First Mobile App. After 4 long months and 475 hours of development I have finally deployed my first mobile app to their respective app stores. In the grand scheme of things I am not sure if this is a long time for developing a mobile app or if it's a relatively quick development lifecycle. To get closer to a definitive answer, i'll break down what the app is and what's its scope, what technologies I used to create the app, the motivation behind the app and what I hope to get out of creating the app.

Tech I am Learning in 2021. This year I will be looking to level up my web development game on the front end as well as the back end. Now that I have a foundational understanding of front end frameworks, back end frameworks and mobile development, this year I want to dig deeper into these nooks so I can move past being just an everyday web developer.

2020: Year in Review. Wow, what a year 2020 has been. It's been weird, whacky and strangely wonderful. Amongst all the chaos that was put forth in the world, some how I found order.

Why I Ditched Expo. Expo is a great third party wrapper for React Native that aids the speed of development and deployment. The Expo SDK provides developers with a lot of mobile native features out of the box and does all the heavy lifting. Another great feature of Expo is the ability use their mobile app to test your app on real devices without having to use Android Studio or XCode.

My First Tech Interview Experience. So three weeks ago I landed my first Software Development job interview. I was recommended by a fellow friend that I met at University this semester. It was for a a role as a Junior Software Developer.

Replacing Moment.js with Alternatives. In September Moment.js officially declared their project entered maintenance mode. This means that no further development would be done and that users should find an alternative.

Hello World. Welcome to my personal website. Thank you for taking the time to join me on my journey as a software developer. My website will be used as a playground to share thoughts and ideas, check out the awesome projects I'm involved with, and read my blog posts about absolutely anything.