<?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: Lucy Kendi</title>
    <description>The latest articles on Forem by Lucy Kendi (@lkendi003).</description>
    <link>https://forem.com/lkendi003</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%2F1715229%2F982b2f3c-e9c6-46eb-867e-fa8b470e3f00.png</url>
      <title>Forem: Lucy Kendi</title>
      <link>https://forem.com/lkendi003</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lkendi003"/>
    <language>en</language>
    <item>
      <title>QA Docs - The Hidden Backbone of QA</title>
      <dc:creator>Lucy Kendi</dc:creator>
      <pubDate>Mon, 20 Oct 2025 23:22:42 +0000</pubDate>
      <link>https://forem.com/lkendi003/qa-docs-the-hidden-backbone-of-qa-12fe</link>
      <guid>https://forem.com/lkendi003/qa-docs-the-hidden-backbone-of-qa-12fe</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.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%2Fifcgqrisfid0c1sl08lf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fifcgqrisfid0c1sl08lf.gif" alt="QA" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I first joined the QA track of &lt;a href="https://hng.tech/internship" rel="noopener noreferrer"&gt;HNG Internship&lt;/a&gt;, it was mostly because I have a knack for spotting faults. Some may call me “nitpicky” — I like to think of it as a superpower. Naturally, I thought my role would be simple: find bugs, report bugs, repeat. Easy, right?&lt;/p&gt;

&lt;p&gt;Well, not exactly.&lt;/p&gt;

&lt;p&gt;My first assignment was on a project called &lt;a href="https://gradific.com/" rel="noopener noreferrer"&gt;Gradific&lt;/a&gt;. The task? Using the system PRD (Product Requirements Document) and FRD (Functional Requirements Document) to create a Test Plan, Test Cases and Non-Functional Requirements document.&lt;/p&gt;

&lt;p&gt;My initial reaction?&lt;br&gt;
&lt;em&gt;"I came to find bugs, not juggle paperwork!"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A quick Google search later revealed that there's even more paperwork: Test Scenarios, Traceability Matrix, Test Summary Reports...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F0k7b37zyas0a7mzkvjqg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F0k7b37zyas0a7mzkvjqg.gif" alt="No, Please No!" width="480" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I went for a snack break to reset, then decided it was time to understand why all this documentation exists.&lt;/p&gt;

&lt;p&gt;Turns out, each document is like a piece of a puzzle, completing the bigger picture of software quality.&lt;/p&gt;

&lt;p&gt;Here's a simple breakdown:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Document&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PRD (Product Requirements Document)&lt;/td&gt;
&lt;td&gt;Explains the &lt;em&gt;why&lt;/em&gt; behind the product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FRD (Functional Requirements Document)&lt;/td&gt;
&lt;td&gt;Details &lt;em&gt;what&lt;/em&gt; the product/system should do&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NFR (Non-Functional Requirements)&lt;/td&gt;
&lt;td&gt;Defines &lt;em&gt;how&lt;/em&gt; the system should behave - in terms of speed, security, reliability, availability and so on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test Plan&lt;/td&gt;
&lt;td&gt;Provides a guide on what and how to perform testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test Cases&lt;/td&gt;
&lt;td&gt;Step-by-step checks from the requirements to verify that the product/system works as expected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traceability Matrix&lt;/td&gt;
&lt;td&gt;Maps requirements to test cases to ensure nothing gets missed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test Summary Report&lt;/td&gt;
&lt;td&gt;Summarizes test results after the testing process&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Suddenly, it all made sense. The PRD and FRD explain why we’re building the system and what to build. The Test Plan and Test Cases confirm that those requirements are met. The Non-Functional Requirements make sure the system runs smoothly, securely, and reliably. And with this in mind, it became very easy to create the required documents.&lt;/p&gt;

&lt;p&gt;My takeaway?&lt;/p&gt;

&lt;p&gt;I’m still in QA for the thrill of finding bugs—but now I have a newfound respect for QA documentation. It’s not just paperwork; it’s the foundation of quality software.&lt;/p&gt;

</description>
      <category>qa</category>
      <category>hng</category>
    </item>
    <item>
      <title>No App is an Island: How APIs Connect Our Digital World</title>
      <dc:creator>Lucy Kendi</dc:creator>
      <pubDate>Thu, 16 Oct 2025 20:32:22 +0000</pubDate>
      <link>https://forem.com/lkendi003/no-app-is-an-island-how-apis-connect-our-digital-world-2a7o</link>
      <guid>https://forem.com/lkendi003/no-app-is-an-island-how-apis-connect-our-digital-world-2a7o</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;APIs are the digital waiters of the internet, seamlessly taking orders from your apps and delivering data from powerful servers all around the world. REST APIs are the most popular type, following a simple set of rules to make this communication fast, reliable, and scalable. They are the invisible glue connecting our digital world, making everything from weather updates to food delivery possible with just a few taps.&lt;/p&gt;




&lt;p&gt;Ever wonder how your phone knows it's going to rain? Or how you can log into a new game using your Google account in one tap? Or how a food delivery rider is able to find your exact spot?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(If you've never wondered, that's okay—you were probably just happily enjoying your delivered food. No judgment here! 😉)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We often just tap and swipe, crossing our fingers for instant results and hoping that pesky loading icon doesn't show up.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.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%2F84d5o4amic7hpy6u3phy.gif" alt="Loading animation" width="150" height="150"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;The loading icon - a sight that fills us all with a tiny bit of anxiety and a whole lot of hope&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;But behind that loading screen, there are quiet conversations taking place. And this is enabled by &lt;strong&gt;APIs&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  So, what is an API?
&lt;/h2&gt;

&lt;p&gt;API stands for &lt;strong&gt;Application Programming Interface&lt;/strong&gt;. Fancy name, simple idea.&lt;/p&gt;

&lt;p&gt;Think of it like ordering a pizza. 🍕&lt;/p&gt;

&lt;p&gt;You (the customer) tell the waiter what you want. The waiter carries your order to the kitchen, then brings the pizza back when it’s ready.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia2.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExeXQ0ZjZqZ3BwanpyNHJyeWM2YWoybno5YncyaHRwNjM5b2Vha256ciZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FuhYKP2f4xRz7q%2Fgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia2.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExeXQ0ZjZqZ3BwanpyNHJyeWM2YWoybno5YncyaHRwNjM5b2Vha256ciZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FuhYKP2f4xRz7q%2Fgiphy.gif" alt="Waiter" width="350" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your phone works the same way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;app&lt;/strong&gt; on your phone (for example, weather app) is the &lt;strong&gt;customer&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;server&lt;/strong&gt; that has the data is the &lt;strong&gt;kitchen&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;API&lt;/strong&gt; is the &lt;strong&gt;waiter&lt;/strong&gt; — the messenger that takes requests from the app and returns the answers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that’s the whole idea behind the name: it's an &lt;strong&gt;Interface&lt;/strong&gt; that lets different &lt;strong&gt;Applications&lt;/strong&gt; (even if written in various &lt;strong&gt;Programming&lt;/strong&gt; languages) talk to each other.&lt;/p&gt;




&lt;h2&gt;
  
  
  Types of APIs
&lt;/h2&gt;

&lt;p&gt;There are several types of APIs. You might hear techy names like &lt;a href="https://blog.postman.com/soap-api-definition/" rel="noopener noreferrer"&gt;SOAP&lt;/a&gt;, &lt;a href="https://grpc.io/docs/what-is-grpc/introduction/" rel="noopener noreferrer"&gt;gRPC&lt;/a&gt; or &lt;a href="https://graphql.org/learn/" rel="noopener noreferrer"&gt;GraphQL&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But the most popular is called a &lt;strong&gt;REST API&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting to Know REST APIs
&lt;/h2&gt;

&lt;p&gt;Now that we know what APIs are, REST stands for: &lt;strong&gt;Representational State Transfer&lt;/strong&gt;. Long name, huh. Feel free to take a quick &lt;strong&gt;rest&lt;/strong&gt; to let that sink in &lt;em&gt;(see what I did there 😉)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Flhxdj9y6ol8n5h5vdav6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Flhxdj9y6ol8n5h5vdav6.gif" alt="Deep breaths animation" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Okay, back to REST! Remember our waiter? They're the API, ferrying requests and responses back and forth.&lt;/p&gt;

&lt;p&gt;REST is just a specific set of rules for how that waiter should do their job. The name tells us everything we need to know: Representational State Transfer. Let's break it down.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;State Transfer&lt;/strong&gt;:&lt;br&gt;
State: This is just "what's going on right now." Your order's state is "one large Hawaiian pizza, cooking in the oven, 5 minutes until done." Transfer means "to move." So, we are moving that information from the kitchen to you. In short, &lt;strong&gt;State Transfer&lt;/strong&gt; = moving the latest info from one place to another.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Representational&lt;/strong&gt;:&lt;br&gt;
This just means that the info is sent and received in a standard, agreed-upon format that is easy to understand, like &lt;a href="https://en.wikipedia.org/wiki/JSON" rel="noopener noreferrer"&gt;JSON&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since we mentioned earlier that REST includes rules to guide the API (waiter) on how to do their job, there are simple commands that are typically used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GET&lt;/strong&gt;: "Can I GET the menu?" (Asks for info)&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;POST&lt;/strong&gt;: "I'd like to POST a new order." (Creates something new)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PUT&lt;/strong&gt;: "I need to PUT a change to my whole order." (Updates everything)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PATCH&lt;/strong&gt;: "Just PATCH the drink on my order." (Updates one little thing)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DELETE&lt;/strong&gt;: "Please DELETE my order." (Cancels it)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These commands are also commonly referred to as &lt;strong&gt;HTTP verbs/methods.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Statelessness in REST APIs
&lt;/h2&gt;

&lt;p&gt;Another key rule of REST is statelessness. This is a fancy word for a simple idea: the waiter has no memory.&lt;/p&gt;

&lt;p&gt;Each time your app makes a request, the API treats it as a brand-new conversation. The waiter doesn't remember your name, your last order, or that you asked for extra napkins five minutes ago. Every single time, you have to reintroduce yourself and state your full request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is this a good thing?
&lt;/h3&gt;

&lt;p&gt;Imagine if a waiter had to remember every single customer's entire history. They'd get overwhelmed and slow down! With statelessness, any waiter (or server) can handle any customer (or app) at any time because every request is self-contained. This makes the whole system incredibly reliable and easy to scale.&lt;/p&gt;

&lt;p&gt;So with each order/request, you have to provide little notes with further context. These are called &lt;strong&gt;Request Headers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Request headers are not the main data, but they help provide further information that may be necessary for the API to do its job.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples of Request Headers&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authorization&lt;/strong&gt; - Proving that you are who you claim to be and have the permission to make orders in the restaurant (login token)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content-Type&lt;/strong&gt; - Tells the server how to read and format the data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User-Agent&lt;/strong&gt; - Tells the server what kind of device is making the request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By including these headers, your app gives the "stateless" waiter all the extra info it needs to successfully complete each individual request.&lt;/p&gt;

&lt;h2&gt;
  
  
  API Security and Performance
&lt;/h2&gt;

&lt;p&gt;For APIs to be useful, they need to be both secure (so your data is safe) and fast (to avoid that endless loading icon!).&lt;/p&gt;

&lt;h3&gt;
  
  
  Keeping Things Secure
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authentication (prove who you are)&lt;/strong&gt;: Use tokens or keys so the API knows the requester is real.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorization (limit what you can do)&lt;/strong&gt;: Even if you’re authenticated, only let you access what you’re allowed to.
&lt;strong&gt;- HTTPS (lock the conversation)&lt;/strong&gt;: Encrypt traffic so nobody can eavesdrop on your order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Input validation (don’t accept nonsense)&lt;/strong&gt;: Check incoming data, so attackers can’t send harmful stuff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limiting &amp;amp; throttling&lt;/strong&gt;: Prevent one user from flooding the kitchen with orders.&lt;/li&gt;
&lt;li&gt;Logging &amp;amp; monitoring: Keep a record and watch for suspicious activity so problems are spotted early.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Keeping Things Fast
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Caching:&lt;/strong&gt; Reuse common answers so the waiter can hand them over immediately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pagination &amp;amp; filtering&lt;/strong&gt;: Don’t bring the whole menu at once; give it in slices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compression&lt;/strong&gt;: Send smaller packets so responses travel faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CDNs &amp;amp; edge caching&lt;/strong&gt;: Put copies of static stuff closer to users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficient endpoints &amp;amp; batching&lt;/strong&gt;: Let clients ask for only what they need and combine requests when possible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring &amp;amp; autoscaling&lt;/strong&gt;: Watch performance and add more “waiters” automatically when traffic spikes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrapping it Up
&lt;/h2&gt;

&lt;p&gt;So next time you check the weather or order food online, remember the friendly Waiter—the API—working behind the screen.&lt;/p&gt;

&lt;p&gt;Just like people, our apps need to talk to each other to make amazing things happen. And APIs are the reason they can.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fnan40r8eoz3m4f9wbbcb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fnan40r8eoz3m4f9wbbcb.png" alt="Phones hi five" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Further Reading
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.blog/2020/03/02/best-practices-for-rest-api-design/" rel="noopener noreferrer"&gt;https://stackoverflow.blog/2020/03/02/best-practices-for-rest-api-design/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://smartbear.com/learn/api-design/understanding-rest-headers-and-parameters/" rel="noopener noreferrer"&gt;https://smartbear.com/learn/api-design/understanding-rest-headers-and-parameters/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>api</category>
      <category>backenddevelopment</category>
    </item>
  </channel>
</rss>
