<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Sean Overton</title>
    <description>The latest articles on Forem by Sean Overton (@s3an_0vert0n).</description>
    <link>https://forem.com/s3an_0vert0n</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1106311%2F7df55bc2-661e-4882-b659-e79e9fa711c5.jpg</url>
      <title>Forem: Sean Overton</title>
      <link>https://forem.com/s3an_0vert0n</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/s3an_0vert0n"/>
    <language>en</language>
    <item>
      <title>4 more lessons from a senior engineer that you may not know yet</title>
      <dc:creator>Sean Overton</dc:creator>
      <pubDate>Sun, 06 Apr 2025 10:24:21 +0000</pubDate>
      <link>https://forem.com/s3an_0vert0n/1-more-lesson-that-senior-engineers-have-learnt-that-you-probably-havent-92i</link>
      <guid>https://forem.com/s3an_0vert0n/1-more-lesson-that-senior-engineers-have-learnt-that-you-probably-havent-92i</guid>
      <description>&lt;p&gt;Many articles aim to define what a senior engineer is and how to become one. That is not this article. The motive of this article is simply a reflection for couple lessons I have relearnt over and over again in my software engineering career as I have matured and become more senior. This article will not be the secret recipe for becoming senior because other resources online cover that topic but instead focuses on one lesson that has personally stood out to me that many engineers still need to learn.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Engineering is almost never binary
&lt;/h2&gt;

&lt;p&gt;That is, the 'correct' way of engineering something may be the 'wrong' way of designing the same thing given different circumstances. To not set yourself up for embarassment, before you judge the 'correctness' of a design especially when you are early in your career you should question, even though I think this could be 'better' (in my opinion) from x design principle I learnt at university or insert-some-other-trending-technology, ask yourself this question: 'why would some senior engineer design it this way?'&lt;/p&gt;

&lt;p&gt;Before you start saying 'x is wrong and y is how we can fix it.' reconsider why it would be engineered this way. &lt;br&gt;
Even better, read any design docs or ask the original developers if you can. In my career so far I have found that more often than not I am incorrect in my initial naive reaction of 'x is bad, and if we simply apply y it will fix it'. I am an advocate to give the original engineers the benefit of the doubt.&lt;/p&gt;

&lt;p&gt;Although be wary of the other side too, although I am advocating to give existing solutions the benefit of the doubt, they could still be objectively 'bad' but be open to more context. One example to be wary of is previous engineers personal agendas or learning interests for specific technologies at the time. If x engineer just wanted to learn about WASM so they wrote the startups entire frontend with it. This wasn't necessarilly a good decision for the business but again just understanding even this agenda can still help influence and improve future decisions.&lt;/p&gt;

&lt;p&gt;A particular context factor to remember is:&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Consider the 'maturity' of the product
&lt;/h2&gt;

&lt;p&gt;The maturity of the product; was/does it currently make money? was/does it have users? was/is it profitable? was/does it have 100 000 Daily-active-users (DAU) or 100 DAU. These factors all significantly influence the engineering decisions in the product. These external factors could be anything surrounding the product and should be an important reminder to engineers of why they do need to care about having an understanding of the business and product.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Learn the product and business
&lt;/h2&gt;

&lt;p&gt;As software engineers, the bottom line is that we are meant to be deliverying value to the business. This is important to remember and connect the dots to revenue. But more than just connecting to revenue, learning the current business context is most important for making correct engineering decisions for the business right now and for the future. It is also imprortant to remember that these context factors change over time.&lt;/p&gt;

&lt;p&gt;This means, an engineering solution that was quick and dirty 2 years ago when the project's goal was to get it's first 100 users and may be proving to be an extreme heartache for engineering now that the product has 100 000 DAU is a perfectly normal and justifiable experience. This is a common phenomena that all engineering teams around the world will experience. The poor engineering decisions of our past becomes what we call technical debt.&lt;/p&gt;

&lt;p&gt;Understanding at a high level the previous stages and growth of the business and product allows engineers to understand and appreciate the context of where products have come from but more importantly the &lt;strong&gt;why&lt;/strong&gt; behind the engineering decisions and the why behind technical debt. You don't need to know everything but learning the fundamentals and a brief history of the product from a business stand point will do you wonders.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Technical debt is normal
&lt;/h2&gt;

&lt;p&gt;Startups may not have automated testing or an automated deployment pipeline or any proper design system or whatever the next 'best practice' is to introduce. As previously mentioned, it's never black and white, some things are good in some cases but it depends on the circumstance. Just because you learn some new perfect design pattern, doesn't mean it will be the perfect solution for all situations. Naive engineers have a tendency to learn something and think this will now work for everything, but in engineering it's always compromise of weighing up pros and cons.&lt;/p&gt;

&lt;h2&gt;
  
  
  A warning to check your ego
&lt;/h2&gt;

&lt;p&gt;This will depend on company to company and team to team, but at some point  in your career you will join a certain project and be blown away by the tech debt. Seemingly senior engineers working on huge successful corporations or unicorn startups will have mountains of tech debt and spaghetti code. You may even naively think to yourself despite your lack of experience: "woah, I could do better than this?!", "How did they get away with this?" etc. etc. the thoughts continue. But I write this as a warning.&lt;/p&gt;

&lt;p&gt;It's generally naive to criticise the tech debt as soon as you see it. It may be justifiable to the business and you can't blame the engineer for poor engineering. Context changes, just because the design is obviously innapropriate now doesn't mean it was not the seemingly best solution when it was first introduced.&lt;/p&gt;

&lt;p&gt;On the flip side of understanding the current state of a project. You have to also be mindful of the new decisions you introduce. Just because you learnt about microservices architecture and how scalable it is at university, do we need to implement this for our new early stage startup that has no users yet? Definitely not. This is over optimising and over engineering. So we start with a monolith. 5 years later another straigh-out-of-uni graduate joins, sees all the issues they are having scaling the monolith and thinks out loud: 'the engineers that designed this were so naive. They should've built it with microservices from the start' but this would be added complexity and overheads for the startup stage and could've killed the company before it made any money. The company at the early stage just needed simplicity so they could focus on tangible features for the customers.&lt;/p&gt;

&lt;p&gt;I recently attended the 'Programmable' conference in Sydney, Australia where a distinguished tech leader (and current CTO) did a fantastic talk on addressing technical debt ('Legacy code'). His talk again reminded me of how engineering decisions are never black and white and that technical debt is normal. One particular quote stood out to me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you don't have bad legacy, you have over engineered&lt;br&gt;
Jeremy Burton&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This line elegantly captures majority of this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  TLDR; in summary
&lt;/h2&gt;

&lt;p&gt;Tech debt is healthy and normal. Too much will lead to an unsustainable product but too little is a sign of over engineering and could kill the company. 'Good' engineering decisions are never binary. The maturity and context of the product has significant influence on what 'good' engineering looks like at that time. The product context changes over time so the engineering also has to evolve. This should be considered when looking at existing projects or working on new features to get the most appropriate outcome for the business.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thanks for reading!
&lt;/h2&gt;

&lt;p&gt;Hey, I am Sean Overton, a passionate software engineer and technical writer who strives on deliverying real user value in products.&lt;/p&gt;

&lt;p&gt;Please share with any colleagues that are interested in becoming more well-rounded engineers.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>discuss</category>
      <category>coding</category>
      <category>programming</category>
    </item>
    <item>
      <title>3 quick tips for your upcoming system design interview</title>
      <dc:creator>Sean Overton</dc:creator>
      <pubDate>Sat, 23 Nov 2024 22:01:20 +0000</pubDate>
      <link>https://forem.com/s3an_0vert0n/3-quick-tips-for-your-upcoming-system-design-interview-3530</link>
      <guid>https://forem.com/s3an_0vert0n/3-quick-tips-for-your-upcoming-system-design-interview-3530</guid>
      <description>&lt;p&gt;I recently read "System Design interview volume 1" by Alex Xu from the ByteByteGo youtube channel and wanted to take some time to write a quick review and share some tips on system design interviews.&lt;/p&gt;

&lt;p&gt;The book was a fantastic read with an easy to follow methodology to approach system design interviews, many commmon system design examples and walkthrough solutions and addresses the essential building technologies that you can pull together in a system. It is quite a comprehensive read and I would recommend for both people who are preparing for a system design interview BUT also for engineers looking to improve their system design practices in general.&lt;/p&gt;

&lt;p&gt;Here are some extra tips for your upcoming interviews:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Know your cloud technologies.&lt;/strong&gt;&lt;br&gt;
This is not necessary but I think is the practical application of system design. By applying and actually building your systems and knowing how to build them practically allows you to gain a more intimate understanding of the black boxes you might mention in a system design interview. This will be obvious in interviews when you discuss details and are capable of deep diving into the blackboxes that are traditionally brought up in system design interviews. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Practice common back-of-the-envelope calculations.&lt;/strong&gt;&lt;br&gt;
Know your commmon calculations. Honestly for myself before reading the System Design Interview book I did not realise how important this might be and also the specific important areas where calculations would be necessary. I believe their is still a bit of an art to deciding where to focus your attention during an interview but asking your interviewer and working with them is one of the best approaches you can take.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Practice the common questions.&lt;/strong&gt;&lt;br&gt;
Obviously you can not prepare for every scenario and interviewers will always be creating new problems but I have heard and seen countless times that they will ask common problems. It does not hurt to be prepared for these designs as it is common practice for the problems to be updated with a 'twist' to make it slightly more unique. Both of the "System Design Interview" books (vol. 1 and vol. 2) provide plenty of the common problems to practice and learn from so I highly recommend them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thanks for reading!
&lt;/h2&gt;

&lt;p&gt;This has been a very quick review of the System Design Interview books by Alex Xu as well as some tips for your upcoming system design interview.&lt;/p&gt;

&lt;p&gt;Thanks again for reading and feel to leave any thoughts in the comments!&lt;/p&gt;

&lt;p&gt;Follow me for more book reviews and quick tips I pick up along the way as I continue my book-per-week reading journey.&lt;/p&gt;

&lt;p&gt;For my full reading list: &lt;a href="https://github.com/SeanOverton/books-i-have-read/blob/main/books.yml" rel="noopener noreferrer"&gt;https://github.com/SeanOverton/books-i-have-read/blob/main/books.yml&lt;/a&gt;&lt;/p&gt;

</description>
      <category>interview</category>
      <category>systemdesign</category>
      <category>webdev</category>
      <category>design</category>
    </item>
    <item>
      <title>A practical introduction to GitOps</title>
      <dc:creator>Sean Overton</dc:creator>
      <pubDate>Tue, 05 Dec 2023 06:04:47 +0000</pubDate>
      <link>https://forem.com/s3an_0vert0n/a-practical-introduction-to-gitops-2eao</link>
      <guid>https://forem.com/s3an_0vert0n/a-practical-introduction-to-gitops-2eao</guid>
      <description>&lt;p&gt;Here is the code base used in this tutorial:&lt;br&gt;
&lt;a href="https://github.com/SeanOverton/example-gitops-serverless-infra"&gt;https://github.com/SeanOverton/example-gitops-serverless-infra&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What is GitOps?
&lt;/h2&gt;

&lt;p&gt;GitOps is a methodology using Git as the source of truth for both infrastructure and application code. It's declarative, ensuring that desired system states are specified in version-controlled files. Changes trigger automatic deployments through CI/CD, providing easy rollbacks and robust version history. Popular in cloud-native environments, GitOps simplifies managing and deploying complex systems.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why GitOps?
&lt;/h2&gt;

&lt;p&gt;GitOps is embraced for its efficiency and reliability in managing and deploying software systems. By making Git the single source of truth, it ensures a declarative approach to configuration, allowing teams to define and track the desired state of both infrastructure and applications. This methodology automates deployments through continuous integration and deployment (CI/CD), streamlining processes and reducing manual errors. With version-controlled changes, GitOps provides a robust audit trail and simplifies rollback procedures. Particularly advantageous in dynamic, cloud-native environments, GitOps enhances collaboration, observability, and overall system resilience, making it a preferred methodology for modern software development and operations.&lt;/p&gt;
&lt;h2&gt;
  
  
  Q. Who is the GitOps Engineers customer?
&lt;/h2&gt;
&lt;h2&gt;
  
  
  A. Other developers!
&lt;/h2&gt;

&lt;p&gt;It is fundamental to GitOps engineering to understand that your 'customer' is other engineers and your 'product' is the repo being provided. This means that the customers and product should be treated similarly to any other outbound facing product. For example, active communication and feedback should be established with the customer.&lt;/p&gt;
&lt;h2&gt;
  
  
  What we will cover in this tutorial
&lt;/h2&gt;

&lt;p&gt;In this tutorial, we will explore the concept of GitOps with an example demonstrating how to build a self-service code repository (using terraform and AWS) to enable developers to quickly deploy REST API's with minimum understanding required of the underlying architecture so developers can focus on the application code itself. The patterns introduced in this example are common to GitOps engineering and help communicate the fundamentals of what GitOps actually is.&lt;/p&gt;
&lt;h2&gt;
  
  
  Who this tutorial is for?
&lt;/h2&gt;

&lt;p&gt;Any aspiring engineers looking to automate more, anyone interested in getting hands on with IaC and anyone interested in understanding the power of GitOps.&lt;br&gt;
It is expected that readers have some knowledge required as a pre-requisite such as basics with GitHub, Git and AWS (including an AWS account).&lt;/p&gt;
&lt;h2&gt;
  
  
  Building a Self-Service Code Repository:
&lt;/h2&gt;

&lt;p&gt;A self-service code repository allows development teams to manage, share, and collaborate on code efficiently. In the following steps we will build an example self-service repository that allows a developer to quickly deploy an API utilising AWS serverless computation: lambdas.&lt;/p&gt;
&lt;h1&gt;
  
  
  Enough talk, let's code!
&lt;/h1&gt;

&lt;p&gt;The code is available here:&lt;br&gt;
&lt;a href="https://github.com/SeanOverton/example-gitops-serverless-infra"&gt;https://github.com/SeanOverton/example-gitops-serverless-infra&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What does the repo do?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;build AWS lambda functions (by default runs python)&lt;/li&gt;
&lt;li&gt;build an AWS rest API gateway, with associated endpoints for each lambda created&lt;/li&gt;
&lt;li&gt;optionally add cognito authorizer to endpoints that require auth&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Setting up:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Fork repo: &lt;a href="https://github.com/SeanOverton/example-gitops-eng-serverless-infra/tree/main"&gt;https://github.com/SeanOverton/example-gitops-eng-serverless-infra/tree/main&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sign in to the AWS console and create a user with Access Key for programmatic access. &lt;a href="https://docs.aws.amazon.com/keyspaces/latest/devguide/access.credentials.html"&gt;https://docs.aws.amazon.com/keyspaces/latest/devguide/access.credentials.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Note: for a production environment it is not recommended to have use access credentials with admin permissions (but for this tutorial, feel free to attach an admin policy). Roles with the concept of least privilege should be applied. *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add these credentials to GitHub secrets with keys:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AWS_ACCESS_KEY
AWS_SECRET_ACCESS_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TMSZXl2n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/agtzezztaj4rnv1wjqqx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TMSZXl2n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/agtzezztaj4rnv1wjqqx.png" alt="Gitops-pushing-code-to-prod" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create an S3 bucket via the AWS console that is only accessible by your previously created user (which you stored the credentials). This bucket will be used to host the tfstate file. This is a dependency of using terraform as seen in this architecture. Your bucket name will need to be unique and will have to be added into the terraform config at: &lt;code&gt;./main.tf&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terraform {
  backend "s3" {
    bucket = "bucket-name"
    key    = "terraform.tfstate"
    region = "ap-southeast-2"
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ftSPbmHt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nhhbnekuilzherrkc8hy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ftSPbmHt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nhhbnekuilzherrkc8hy.png" alt="Image description" width="401" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure AWS CLI credentials locally and run &lt;code&gt;terraform init&lt;/code&gt; to initialise terraform backend state file in the S3 bucket.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;
  
  
  How a developer interacts with the repo
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Infrastructure config
&lt;/h2&gt;

&lt;p&gt;Once the project is set up from the above steps. A developer would only have to update the &lt;code&gt;./config.tfvars&lt;/code&gt; file to build infrastructure for the new endpoint. The changes only require understanding of a few minor parameters as shown below. &lt;/p&gt;

&lt;p&gt;But first create a branch locally: &lt;code&gt;git branch feature/gitops-is-fun&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then make the below changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lambda_functions = {
  + helloworld = {
    + function_name   = "helloworld"
    + auth_required   = false
    + endpoint_method = "GET"
  + },
}

cognito_user_arns = []

stage_name = "default"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The example config code above will create the endpoint and AWS cloud infastructure to support an endpoint that can receive HTTP GET requests. The application code will be added next.&lt;/p&gt;

&lt;h2&gt;
  
  
  The endpoint application code
&lt;/h2&gt;

&lt;p&gt;A new folder and file can now be created to store the endpoints application code: &lt;code&gt;./lambdas/helloworld/lambda_function.py&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Warning: the folder name 'helloworld' matches the function_name from the previous config!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This file will be what runs at the above configured GET request endpoint. Add the following helloworld response to this file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import json

def respond(err, res=None):
    return {
        'statusCode': '400' if err else '200',
        'body': err.message if err else json.dumps(res),
        'headers': {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Origin' : '*',
        },
    }

def lambda_handler(event, context):
    return respond(None, "Helloworld")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the hardwork is done! Watch the platform's magic work!&lt;/p&gt;

&lt;h2&gt;
  
  
  Merging in
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Push.&lt;/strong&gt; &lt;code&gt;git push&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pull request.&lt;/strong&gt; On GitHub, create a pull-request from your recent changes. &lt;br&gt;
This will trigger a plan workflow that ends with something similar to:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
Plan: x to add, 0 to change, 0 to destroy.

─────────────────────────────────────────────────────────────────────────────

Saved the plan to: tf-plan

To perform exactly these actions, run the following command to apply:
    terraform apply "tf-plan"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is terraform highlighting what changes will be made to your current infrastructure. This is a dry run when you can detect if everything will work as expected before actually deploying the infrastructure.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Merge&lt;/strong&gt;. After reviewing the expected changes. Merge the PR into the main branch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now check the actions tab to find your deployment url in the latest workflow run. (This was defined as a terraform output)&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
Apply complete! Resources: x added, 0 changed, 0 destroyed.

Outputs:
deployment_url = "https://&amp;lt;deployment_url&amp;gt;/&amp;lt;stage&amp;gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Test!
&lt;/h2&gt;

&lt;p&gt;Visit: &lt;code&gt;https://&amp;lt;deployment_url&amp;gt;/helloworld&lt;/code&gt;.&lt;br&gt;
You should receive a &lt;code&gt;helloworld&lt;/code&gt; response. If not, review the steps and checkout the workflow outputs. &lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the repo itself
&lt;/h2&gt;

&lt;p&gt;The repo has a couple of stages that need to be understood.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Terraform Modules (IaC) and Config&lt;/strong&gt;&lt;br&gt;
The first stage is the terraform config. This is the tfvars that was edited &lt;code&gt;./config.tfvars&lt;/code&gt;. The .tfvars file type is a file type used for passing user defined values for input variables into terraform code similar to parameters being passed into a function. Note the &lt;code&gt;function_name&lt;/code&gt; parameter is important here and will be used for the API endpoint name ie. &lt;code&gt;https://unique-aws-path/&amp;lt;function_name&amp;gt;&lt;/code&gt; as well as required for the folder structure defining the application code: &lt;code&gt;./lambdas/&amp;lt;function_name&amp;gt;/lambda_function.py&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The GitHub action&lt;/strong&gt; (automated workflows for continuous deployment)&lt;br&gt;
The GitHub action (defined at &lt;code&gt;.github/workflows/terraform-workflow.yml&lt;/code&gt;) is the automated workflow that automates the terraform dry-run and deployment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CLFMJ0pT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ck3fhr0srclxibsixnh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CLFMJ0pT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ck3fhr0srclxibsixnh.jpg" alt="Image description" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.1 The &lt;code&gt;terraform plan&lt;/code&gt;&lt;/strong&gt; is triggered when a pull-request is raised which causes a dry-run to run and would allow a team to effectively review the expected changes before actually applying them. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.2 The &lt;code&gt;terraform apply&lt;/code&gt;&lt;/strong&gt; (which only runs when changes occur in the 'main' branch) will use the above created plan and deploy it.&lt;/p&gt;

&lt;p&gt;When used with GitHub branch protection with minimum required reviews this then allows for a safe but efficient workflow for teams to review the expected changes, approve and deploy the API endpoints quickly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The application code&lt;/strong&gt;&lt;br&gt;
This is referenced in the terraform modules to be deployed at the AWS lambda function and was defined in &lt;code&gt;./lambdas/helloworld/lambda_function.py&lt;/code&gt;in the example above. It should be noted, that any name could replace the &lt;code&gt;helloworld&lt;/code&gt; in this case and as long as the tfvars config is also updated with corresponding information the new API endpoint code will be deployed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This has been a hands-on introduction demonstrating an example of what Gitops engineering may look like!&lt;/p&gt;

&lt;p&gt;Do you want to instantly improve your API design? &lt;br&gt;
Check out this article: &lt;a href="https://dev.to/s3an_0vert0n/10-quick-tips-to-instantly-improve-api-design-59mc"&gt;https://dev.to/s3an_0vert0n/10-quick-tips-to-instantly-improve-api-design-59mc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me for more book reviews and quick tips I pick up along the way as I continue my book-per-week reading journey.&lt;/p&gt;

&lt;p&gt;For my full reading list: &lt;a href="https://github.com/SeanOverton/books-i-have-read/blob/main/books.yml"&gt;https://github.com/SeanOverton/books-i-have-read/blob/main/books.yml&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>terraform</category>
      <category>python</category>
      <category>devops</category>
    </item>
    <item>
      <title>A quick Functional Programming recap</title>
      <dc:creator>Sean Overton</dc:creator>
      <pubDate>Mon, 02 Oct 2023 06:17:25 +0000</pubDate>
      <link>https://forem.com/s3an_0vert0n/a-quick-functional-programming-recap-2o0d</link>
      <guid>https://forem.com/s3an_0vert0n/a-quick-functional-programming-recap-2o0d</guid>
      <description>&lt;p&gt;I recently read &lt;strong&gt;&lt;em&gt;Grokking Simplicity: Taming complex software with Functional Thinking&lt;/em&gt; by Eric Normand&lt;/strong&gt; to formalise my understanding of the foundations of functional programming as I realised I had only ever been introduced to this paradigm anecdotally from colleagues. An extremely practical book that breaks the Functional Programming (FP) stigma that it is a traditionally very theoretical subject. The book avoids the maths and presents digestible, actionable tips and examples laying the foundations. Read on to understand what, why and how it is applied.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is FP?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Functional programming provides techniques for organizing &lt;strong&gt;side effects&lt;/strong&gt; so they don't occur just anywhere"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  So what are side effects?
&lt;/h3&gt;

&lt;p&gt;Some examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implicit arguments such as global variables&lt;/li&gt;
&lt;li&gt;If a variable is passed by reference and it is written to inside the function&lt;/li&gt;
&lt;li&gt;Anything that has an external affect such as sending an email or interacting with an external API&lt;/li&gt;
&lt;li&gt;A function is defined as &lt;strong&gt;impure&lt;/strong&gt; if it has any side effects. These functions are also sometimes referred to as &lt;strong&gt;actions&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  So what are pure functions?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Opposite of impure functions XD&lt;/li&gt;
&lt;li&gt;Inputs are all explicit arguments. That is they are passed in as actual function arguments. As opposed to an implicit argument such as global variable, which is still an input to a function BUT not passed in as an argument.&lt;/li&gt;
&lt;li&gt;Outputs are all returned values (no implicit outputs)&lt;/li&gt;
&lt;li&gt;No globals (implicit arg)&lt;/li&gt;
&lt;li&gt;Data/pure functions are &lt;strong&gt;'idempotent' (&lt;em&gt;idempotent&lt;/em&gt; meaning it doesn't matter how many times it is run/accessed it returns the same result)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comparison by example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var someGlobalData = [];

function impureExample(){
someGlobalData.doSomething(); // this global var is both an implicit argument and implicit output
}

function pureExample(explicitArg){
// the function argument here is explicitly an argument
explicit_arg.doSomething()
return true; // explicit output
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see in the above example, if you were to call the impure function, it can be difficult to tell what side effects will occur, while a pure function is a lot more predictable as you supply the data and can expect a returned value. Hopefully that helps clarify the differences as well as starts showing why Functional programmers tend towards pure functions where possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Now, why is this beneficial?
&lt;/h2&gt;

&lt;p&gt;Functional programming works well in distributed systems where &lt;strong&gt;Idempotency&lt;/strong&gt; is important. Idempotency is important when concurrent read/writing and/or actions could be occuring.&lt;/p&gt;

&lt;p&gt;Pure functions are also easier to test and more predictable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: &lt;em&gt;this does not mean FP should be applied in all cases (OOP still has its use cases (; ).&lt;/em&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Functional programming in practice:
&lt;/h2&gt;

&lt;p&gt;The following is a few key tips to help apply FP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use pure functions where possible&lt;/strong&gt; (it's impossible to eliminate because they are where actual actions occur but aim to reduce and control where they occur).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Impure functions create other impure functions&lt;/strong&gt;&lt;br&gt;
eg.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// this function is also impure because it calls another impure function. The impurity spreads to all the calling functions.
function send_email_wrapper(){
    send_email() // this function is impure because it sends an email ie. it has a 'side-effect' and effects an external system
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep impure functions small:&lt;/strong&gt; This can be achieved by pulling all of the data and whatever pure functions you can to be external of the impure function&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;seperate data from functions&lt;/strong&gt; so they evolve independently and are decoupled&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Make pure functions generic&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use immutable data&lt;/strong&gt; to avoid side effects. Immutable data is data that can't be changed. So how do you make a system that is not completely static? Make copies, and you will have to change the copies. Read on.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Defensive copying:
&lt;/h2&gt;

&lt;p&gt;This is the idea that by copying the input data inside a function and returning a copy of the data, no side effects should escape from a function.&lt;/p&gt;

&lt;p&gt;Summarised as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copy data as it enters the code&lt;/li&gt;
&lt;li&gt;Copy data as it leaves the code&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dealing with async functions:
&lt;/h2&gt;

&lt;p&gt;A general rule for helping to make async functions as 'pure' as possible is to 'return' a callback function (by calling it) rather than returning a value.&lt;/p&gt;

&lt;h1&gt;
  
  
  Thanks for reading!
&lt;/h1&gt;

&lt;p&gt;This has been a very brief summary highlighting the foundations of Functional Programming as explained in &lt;strong&gt;&lt;em&gt;Grokking Simplicity: Taming complex software with Functional Thinking&lt;/em&gt; by Eric Normand&lt;/strong&gt;. A fantastic read for anyone looking for a practical read on functional programming principles.&lt;/p&gt;

&lt;p&gt;Thanks again for reading and feel to leave any thoughts in the comments!&lt;/p&gt;

&lt;p&gt;Follow me for more book reviews and quick tips I pick up along the way as I continue my book-per-week reading journey.&lt;/p&gt;

&lt;p&gt;For my full reading list: &lt;a href="https://github.com/SeanOverton/books-i-have-read/blob/main/books.yml"&gt;https://github.com/SeanOverton/books-i-have-read/blob/main/books.yml&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>javascript</category>
      <category>react</category>
      <category>functional</category>
    </item>
    <item>
      <title>8 tips from the Engineers' Survival Guide</title>
      <dc:creator>Sean Overton</dc:creator>
      <pubDate>Sun, 17 Sep 2023 08:26:01 +0000</pubDate>
      <link>https://forem.com/s3an_0vert0n/8-tips-from-the-engineers-survival-guide-13d6</link>
      <guid>https://forem.com/s3an_0vert0n/8-tips-from-the-engineers-survival-guide-13d6</guid>
      <description>&lt;p&gt;This week I read &lt;strong&gt;&lt;em&gt;Engineers' Survival Guide&lt;/em&gt; by Merih Taze&lt;/strong&gt; and I can't recommend this book enough for all software-engineers. A fantastic read packed with insightful anecdotes and tips for advancing and improving your career. The following is my top 8 tips from this fantastic book.&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Visibility is everything.
&lt;/h1&gt;

&lt;p&gt;The author Merih Taze highlights in this chapter the importance of being 'known' at your workplace and how much it will positively impact you career. When it comes to promotions or finding the right person for a new opportunity people should recognise who you are because of your visible contributions across the company making it easy for them to accept and recommend you. Some simple tips he shares to improve your visibility include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Share status updates to your team but also the wider community if it is relevant.&lt;/li&gt;
&lt;li&gt;Engage on public posts.&lt;/li&gt;
&lt;li&gt;Be active on design documents.&lt;/li&gt;
&lt;li&gt;Comment on code reviews.&lt;/li&gt;
&lt;li&gt;Avoid answering DM's and request to share them on the wider community dev channels to answer more people that might have similar questions.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  2. The importance of tools and patterns.
&lt;/h1&gt;

&lt;p&gt;Always consider if their is a tool that can do your task better, faster and with fewer mistakes. Stay active in learning and discovering new tools. For example see if their is a CLI tool that can help parse this document and extract what you need. etc.&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Side projects and knowing your surroundings.
&lt;/h1&gt;

&lt;p&gt;This chapter outlined why it is good practice to network with other teams and learn what other projects are going on around the organisation. The benefits of this include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Becoming more senior as you are the goto person for checking if ideas are worth pursuing.&lt;/li&gt;
&lt;li&gt;Connect and help other teams via design discussions. Growth opportunities.&lt;/li&gt;
&lt;li&gt;Opens new career opportunities. You may be able to join projects you are more passionate about.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  4. Importance of networking.
&lt;/h1&gt;

&lt;p&gt;This is similar to some of the previous points. Networking with colleagues, which may come across as daunting for many engineers can be greatly beneficial for your career if used correctly. Never think of networking as I need to network to gain something but just introduce into your day-to-day life. Get involved in whatever networking opportunities present themselve.&lt;/p&gt;

&lt;h1&gt;
  
  
  5. Do not redesign a working system.
&lt;/h1&gt;

&lt;p&gt;This might be a tough one for engineers to digest. And their may be exceptions to this rule but the costs vs benefits should be seriously considered before undertaking a redesign. Merih Taze emphasizes that so much business logic will be tied up in that spaghetti code where various bugs and exceptions have been caught to get to this stable system that it can be a huge amount of work to redesign or reimplement a working system. He suggests careful consideration needs to be made as to why and for what benefits the changes are necessary. &lt;/p&gt;

&lt;h1&gt;
  
  
  6. Knowing popular frameworks and how they work.
&lt;/h1&gt;

&lt;p&gt;This chapter was one that particularly resonated with myself. A general high level knowledge of popular frameworks will enable you in wider community design discussions and even just understanding what different teams across the company are up to and general chat with other engineers, helping you build relationships. For me personally, I could quickly develop a respectful relationship with senior engineers as a junior engineer who was aware of the wider variety of frameworks for both frontend and backend engineering in a suite of languages.&lt;/p&gt;

&lt;h1&gt;
  
  
  7. Use debuggers. Learn them and master them.
&lt;/h1&gt;

&lt;p&gt;Debuggers are a seemingly illusive tool that many junior engineers surprisingly manage to avoid proper contact during the early stages of their career. My personal anecdotal data would suggest universities struggle or complete miss the opportunity to teach this fundamental skill of software engineering. Merih Taze suggests that learning and becoming a master at using a debugger in your respective IDE is a vital skill for progressing as an engineer. If you find yourself typing &lt;code&gt;print(some_variable)&lt;/code&gt; several times in your code while debugging, you need to start learning and using a proper debugger and reaping it's rewards.&lt;/p&gt;

&lt;h1&gt;
  
  
  8. Align, align, and align again.
&lt;/h1&gt;

&lt;p&gt;This one, I feel like is one of the most powerful comments the Engineers' survival guide makes. It suggests that as an engineer and employee you should align your goals with your team, management, division and company. This should be revisited often as change is common and ensures as an individual you are making sure you are impacting and adding value in the area's that the company needs it most.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thanks for reading!
&lt;/h2&gt;

&lt;p&gt;That summarises my top 8 favourite tips from the &lt;strong&gt;&lt;em&gt;Engineers' survival guide&lt;/em&gt; by Merih Taze&lt;/strong&gt;. I definitely recommend getting a copy for yourself.&lt;/p&gt;

&lt;p&gt;Thanks again for reading and feel to leave any thoughts in the comments!&lt;/p&gt;

&lt;p&gt;Follow me for more book reviews and quick tips I pick up along the way as I continue my book-per-week reading journey.&lt;/p&gt;

&lt;p&gt;For my full reading list: &lt;a href="https://github.com/SeanOverton/books-i-have-read/blob/main/books.yml"&gt;https://github.com/SeanOverton/books-i-have-read/blob/main/books.yml&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>softwareengineering</category>
      <category>softwaredevelopment</category>
      <category>workplace</category>
    </item>
    <item>
      <title>10 quick tips to instantly improve API design</title>
      <dc:creator>Sean Overton</dc:creator>
      <pubDate>Sun, 17 Sep 2023 05:14:13 +0000</pubDate>
      <link>https://forem.com/s3an_0vert0n/10-quick-tips-to-instantly-improve-api-design-59mc</link>
      <guid>https://forem.com/s3an_0vert0n/10-quick-tips-to-instantly-improve-api-design-59mc</guid>
      <description>&lt;p&gt;After recently reading &lt;strong&gt;"&lt;em&gt;REST API design rulebook"&lt;/em&gt; by Mark Masse&lt;/strong&gt;, I am writing to share a couple of quick take-aways for designing web API's.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zq4wvxoiqwhvy7f25ic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zq4wvxoiqwhvy7f25ic.png" alt="what-is-an-API?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are the 10 quick tips. Happy reading!&lt;/p&gt;

&lt;h3&gt;
  
  
  1. A singular noun should be used for document names.
&lt;/h3&gt;

&lt;p&gt;eg. &lt;code&gt;https://example-domain.com/blogs/my-blog&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A plural noun should be used for collection/store names.
&lt;/h3&gt;

&lt;p&gt;eg. &lt;code&gt;https://example-domain.com/blogs&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A verb or verb phrase should be used for controller names.
&lt;/h3&gt;

&lt;p&gt;Controllers are endpoints that have a non-standard function outside of HTTP standard method types such as GET/POST/UPDATE/DELETE.&lt;br&gt;
eg. &lt;code&gt;https://example-domain.com/send-email&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  4. CRUD function names should not be used in URIs.
&lt;/h3&gt;

&lt;p&gt;eg. Code smell: &lt;br&gt;
&lt;code&gt;https://example-domain.com/update-post/1234&lt;/code&gt;&lt;br&gt;
or &lt;code&gt;https://example-domain.com/delete-post/1234&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Instead this should be the same endpoint and the correct http methods should be used:&lt;br&gt;
&lt;code&gt;PUT https://example-domain.com/posts/1234&lt;/code&gt;&lt;br&gt;
&lt;code&gt;DELETE https://example-domain.com/posts/1234&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Query parameters are for either filtering or pagination:
&lt;/h3&gt;

&lt;p&gt;eg. &lt;code&gt;GET /posts?author=sean-overton&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;These should support a 'partial' or filtered JSON response where only required fields are returned. &lt;/p&gt;
&lt;h3&gt;
  
  
  6. Use appropriate HTTP methods for their expected functions.
&lt;/h3&gt;

&lt;p&gt;Post = Create object &lt;code&gt;/posts&lt;/code&gt;&lt;br&gt;
Get = Retrieval &lt;code&gt;/posts&lt;/code&gt; or &lt;code&gt;/posts/1234&lt;/code&gt;&lt;br&gt;
Put = Update Object in place &lt;code&gt;/posts/1234&lt;/code&gt;&lt;br&gt;
Delete = Delete's object in place eg. &lt;code&gt;/posts/1234&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Don't tunnel other request methods via GET/POST. This is a common code smell observed in junior API developers code.&lt;br&gt;
eg. don't delete an entity with a GET request. Use the delete HTTP method.&lt;/p&gt;
&lt;h3&gt;
  
  
  7. Use response status codes appropriately. (so they can be handled appropriately in the client!)
&lt;/h3&gt;

&lt;p&gt;100: Transfer protocol information&lt;br&gt;
200: Okay/success responses&lt;br&gt;
300: Redirects&lt;br&gt;
400: Bad requests (client side error in request)&lt;br&gt;
500: Server side errors (server side error occurs)&lt;/p&gt;
&lt;h3&gt;
  
  
  8. Use Http Headers with appropriate metadata defined.
&lt;/h3&gt;

&lt;p&gt;eg. &lt;code&gt;Content-Type: application/json&lt;/code&gt; (a required header!)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: These are occasionally abstracted away in frameworks with defaults but it is still recommended to test these for yourself and override when appropriate.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  9. Use &lt;strong&gt;Cache-Control, Expires, and Date&lt;/strong&gt; response headers.
&lt;/h3&gt;

&lt;p&gt;This is to encourage caching which in turn should help improve performance. These fields can define time to live (TTL) for respective objects before they are required to be refected.&lt;/p&gt;
&lt;h3&gt;
  
  
  10. Errors should have a consistent form (JSON/XML schema):
&lt;/h3&gt;

&lt;p&gt;eg.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
"id" : 1234,
"message": "Some error occured"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is so error's can be consistently handled in the frontend or client service.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thanks for reading!
&lt;/h3&gt;

&lt;p&gt;With the development of automatic code generation tools such OpenAPI generator (&lt;a href="https://openapi-generator.tech/" rel="noopener noreferrer"&gt;https://openapi-generator.tech/&lt;/a&gt;), the importance of API &lt;strong&gt;design&lt;/strong&gt; rather than implementation is emphasized. &lt;/p&gt;

&lt;p&gt;Follow me for more book reviews and quick tips I pick up along the way as I continue my book-per-week reading journey.&lt;/p&gt;

&lt;p&gt;For my full reading list: &lt;a href="https://github.com/SeanOverton/books-i-have-read/blob/main/books.yml" rel="noopener noreferrer"&gt;https://github.com/SeanOverton/books-i-have-read/blob/main/books.yml&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>webdev</category>
      <category>programming</category>
      <category>restapi</category>
    </item>
  </channel>
</rss>
